文件上传下载

 

一、文件上传

  1. 文件上传即将本地文件上传到远程服务器
  2. 文件上传实际上是以流的形式上传到远程服务器

 

  1. 文件上传需要满足的条件:
    1. 文件上传form表单的提交方式必须为post
    2. 文件上传的input表单项中的type属性值必须为file
    3. 文件上传form表单中的enctype的属性值必须为:multipart/form-data
      1. Enctype的值为application/x-www-form-urlencoded,表单提交的时候对表单中的数据进行url编码,编码后的数据为,属性=属性值&属性2=属性值2
      2. Enctype的值为multipart/form-data的话,表单提交的时候,表单中的表单项是以一个多部件的形式提交到后台服务器,每一个表单项就是一个多部件,每个多部件之间使用类似于“-----------------------------7e3354253f0706”这样的分隔符隔开;
  1. FileUpload
  1. 使用filetUpload工具进行文件上传下载处理
  2. 使用的时候需要导入jar包

文件上传下载

 

    1. 文件上传用到的核心类和接口
  1. DiskFileItemFactory :解析器工厂
  2. ServletFileUpload :得到解析器
  3. FileItem :通过ServletFileUpload 解析器解析请求,得到FileItem 对象,每一个表单项对应了一个FileItem 

 

 

  1. 七个核心方法:

fileItem.isFormField():判断该表单项是否是一个普通表单项,普通表单项即type不是file的表单项

* fileItem.getString(编码格式):获取普通表单项中的文本,还可以指定文本的编码格式

*  fileItem.getFieldName():获取表单中的name属性值

*  fileItem.getContentType():获取文件的类型

*  fileItem.getSize():获取文件大小

*  fileItem.getName():获取文件的名称

*  fileItem.write(new File()):把为文件上传到远程服务器

  1. 限制文件上传的大小

ServletFileUpload sfu=new ServletFileUpload(dff);

//限制上传单个文件不能大于600kb

//如果单个文件大于600kb了会触发FileSizeLimitExceededException异常

sfu.setFileSizeMax(1024*600);

//限制多个文件上传大小不能大于1024kb

//如果多个个文件大于1024kb了会触发SizeLimitExceededException异常

sfu.setSizeMax(1024*1024);

 

  1. 文件上传示例:

 

<form action="doUpload" method="post" enctype="multipart/form-data">

              用户名:<input type="text" name="username"><br>

              头像:<input type="file" name="photo" accept="image/*"><br/>

<!--               头像1<input type="file" name="photo1" accept="image/*"><br/> -->

              <input type="submit">

       </form>

 

//得到解析器工厂

DiskFileItemFactory dff=new DiskFileItemFactory();

//得到解析器,进行解析请求

ServletFileUpload sfu=new ServletFileUpload(dff);

//限制上传单个文件不能大于600kb

sfu.setFileSizeMax(1024*600);

//限制多个文件上传大小不能大于1024kb

sfu.setSizeMax(1024*1024);

//通过解析器解析请求,得到FileItem,每一个FileItem对应了一个表单项

try {

       List<FileItem> fileItems = sfu.parseRequest(request);

       /*解析每一个表单项

        * 7个核心方法:

        * fileItem.isFormField():判断该表单项是否是一个普通表单项,普通表单项即type不是    file的表单项

        * fileItem.getString(编码格式):获取普通表单项中的文本,还可以指定文本的编码格式

        *  fileItem.getFieldName():获取表单中的name属性值

        *  fileItem.getContentType():获取文件的类型

        *  fileItem.getSize():获取文件大小

        *  fileItem.getName():获取文件的名称

        *  fileItem.write(new File()):把为文件上传到远程服务器

        */

       for (FileItem fileItem : fileItems) {

              if(fileItem.isFormField()) {

                     //获取表单中的文本

                     String string = fileItem.getString("utf-8");

                     //获取表单中的name属性值

                     String fieldName = fileItem.getFieldName();

                     System.out.println(string+"---"+fieldName);

              }else {

                     //获取文件的类型

                     String contentType = fileItem.getContentType();

                     //获取文件大小

                     long size = fileItem.getSize();

                     //文件大于0的话再上传

                     if(size>0) {

                            //获取文件的名称

                            String fileName = fileItem.getName();

                            //把文件上传到tomcat服务器

                            //"/"代表项目路径(http://localhost:8080/day20_uploadDemo

                            String realPath = getServletContext().getRealPath("/upload");

                            File file=new File(realPath);

                            //判断路径是否存在

                            if(!file.exists()) {

                                   //不存在创建该目录

                                   file.mkdirs();

                            }    

                            //使用ie浏览器的话,获取的文件名称会携带盘符,所有要去掉盘符

                            fileName=fileName.substring(fileName.lastIndexOf("\\")+1);

                            //为了保证图片名称相同导致服务覆盖名称相同的图片的问题,我们需要                       修改原有图片的名称

                            fileName=UUID.randomUUID()+"_"+fileName;

                            //把文件上传到realPath目录下文件名称为fileName

                            fileItem.write(new File("G:/offcn/img/"+fileName));

                            request.getSession().setAttribute("fileName", fileName);

                            response.sendRedirect(request.getContextPath()+"/index.jsp");

                     }else {

                            request.getSession().setAttribute("msg","文件大小不能小于0");

                            response.sendRedirect(request.getContextPath()+"/index.jsp");

                     }

              }

       }

}catch (FileSizeLimitExceededException e) {

       request.getSession().setAttribute("msg","文件大小不能大于600kb");

       response.sendRedirect(request.getContextPath()+"/index.jsp");

}catch (SizeLimitExceededException e) {

       request.getSession().setAttribute("msg","多个文件大小不能大于1024kb");

       response.sendRedirect(request.getContextPath()+"/index.jsp");

} catch (FileUploadException e) {

       // TODO Auto-generated catch block

       e.printStackTrace();

} catch (Exception e) {

       // TODO Auto-generated catch block

       e.printStackTrace();

}

 

    1. Tomcat挂载本地目录
  1. 由于每次重启tomcat,就会重新部署项目,一重新部署项目,之前上传的文件就丢失了

文件上传下载

 

文件上传下载

  1. Servlet3.0提供的文件上传
  1. 文件上传需要满足的条件:
    1. 文件上传form表单的提交方式必须为post
    2. 文件上传的input表单项中的type属性值必须为file
    3. 文件上传form表单中的enctype的属性值必须为:multipart/form-data
    4. 处理文件上传的servlet需要加入@MultipartConfig注解,对文件上传的支持
    5. Part part=request.getPart(“name属性值”);得到文件上传表单项,每个Part对象对应了一个文件上传表单项;

 

 

 

  1. 使用示例:

文件上传下载

 

@WebServlet("/FileUploadServelt02")

@MultipartConfig

public class FileUploadServelt02 extends HttpServlet {

       private static final long serialVersionUID = 1L;

    public FileUploadServelt02() {

        super();

    }

       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              request.setCharacterEncoding("utf-8");

              //得到表单中的普通表单项中的数据

              String username = request.getParameter("username");

              //得到文件上传表单项

              Part part = request.getPart("photo");

              if(part.getSize()>0&&part.getSize()<1048576) {

                     //String name = part.getName();//获取文件上传表单项的name属性值

                     //System.out.println(username+"=="+part.getName()+"==="+part.getSize());

                     //得到文件的名称

                     String header = part.getHeader("Content-Disposition");

                     //解析请求头得到文件名

                     String fileName=header.substring(header.lastIndexOf("filename")+10,header.length()-1);

                     //去除使用ie浏览器的时候的盘符

                     fileName=fileName.substring(fileName.lastIndexOf("\\")+1);

                     //修改文件名称

                     fileName=UUID.randomUUID()+"_"+fileName;

                     //文件上传

                     part.write("G:\\offcn\\img\\"+fileName);

                     request.getSession().setAttribute("fileName", fileName);

                     response.sendRedirect(request.getContextPath()+"/servlet3.0Upload.jsp");

              }else {

                     request.getSession().setAttribute("msg","文件不能小于0并且文件不能大于1M");

                     response.sendRedirect(request.getContextPath()+"/servlet3.0Upload.jsp");

              }

       }

 

       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              doGet(request, response);

       }

 

}