文件上传功能实现(一)

时间:2021-04-26 12:22:40
文件上传: ①上传前的准备工作(准备一个注册的表单页面)     创建一个文件上传的控件,点击这个控件就可以选择需要上传的文件了     <form action="/upload" method="post" enctype="multipart/form-data">     <input type="file" name="headimg" />        注意:上传时表单的上传类型必须是:multipart/form-data              上传的method必需是POST   当设置了multipart/form-data的时候,就不会对字符进行编码了,而Servlet中拿到的值与数据必需是经过 编码的值,所以要解决这个问题,就需要对上传的东西进行字符编码.   ②准备一个上传的Servlet,到后台接收传过来的普通表单数据 与 文件(二进制)   ③导入相应的FileUpload jar包 (commons-fileupload-1.2.2.jar ,commons-io-1.4.jar)     这两个包的作用,前者可以让我们通过教程学会文件的上传功能实现,后面的这个包里面的   

  FilenameUtils 里面得工具可以帮我们完善这个文件上传的功能修复BUG     

④使用jar包 打开jar包找到index.html 小提示:在首页总有一个开发指南(User Guide)或者快速上手(Quick Start )等着你   ⑤根据快速入门解析完成一个文件上传的功能 代码: @WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        //创建一个工厂解析这个请求,得到的是一个集合,这个集合装的就是一个请求对象,封装的就是每一条请求数据
        try {
            // 创建一个工厂
            FileItemFactory factory = new DiskFileItemFactory();
            
            // 创建一个文件上传的处理器
            ServletFileUpload upload = new ServletFileUpload(factory);
            
            //解析这个请求:解析完之后咱们可以拿到一个FileItem的集合
            List < FileItem > items = upload.parseRequest(req);
            
            //通过遍历集合可以拿到上传的文件的属性值,包括属性名,值..
            for (FileItem fileItem : items) {                
                //上面的测试可以看输出,普通控件和file控件的处理方式是要区别对待的
                if(fileItem.isFormField()){
                    //代表是一般表单,用一般表单的处理方式解决即可                
                }else{
                    //拿到上传文件的名称(有ie版本问题)
                    //String upname=fileItem.getName();   
                           
                    //有重名文件上传的问题
                    String upname = FilenameUtils.getName(fileItem.getName());
                    
                    //有保存路路径的问题有的操作系统没有盘符
                    File uploadFile = new File("D:/",upname);
                                        
                    //将本地的文件写到服务器中
                    fileItem.write(uploadFile);
                }                
            }            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
    }
}
  说明:这个只能实现本地上传,还有许多bug需要修复,在后面会有详细的解决方案