day15_文件上传&文件下载

文件上传

1. 实现文件上传思路

  • 准备

    • 表单

      • method=”post”
      • enctype=”multipart/form-data”
      • type=”file”
    • 两个jar包

      • commons-fileupload.jar
      • commons-io.jar
  • 代码

    1. 创建DiskFileItemFactory对象,为创建解析器做准备。
    2. 创建ServletFileUpload解析器,调用parseRequest()方法,将request对象,解析为List
    3. 调用FileItem中isFormField(),查找文件参数
    4. 调用FileItem中writer()方法,实现文件上传

2. 实现文件上传示例代码

  1. response.setContentType("text/html;charset=UTF-8");
  2. //1. 创建DiskFileItemFactory对象,为创建解析器做准备。
  3. DiskFileItemFactory factory = new DiskFileItemFactory();
  4. //2. 创建ServletFileUpload解析器,
  5. ServletFileUpload upload = new ServletFileUpload(factory);
  6. //调用parseRequest()方法,将request对象,解析为List<FileItem>
  7. //获取upload真实路径
  8. String realPath = getServletContext().getRealPath("/upload");
  9. //优化【文件不存在时自动创建】问题
  10. File fPath = new File(realPath);
  11. if(fPath.exists()==false){
  12. fPath.mkdir();
  13. }
  14. //设置文件上传上限最大为:100kb
  15. upload.setFileSizeMax(102400);
  16. try {
  17. List<FileItem> fileItems = upload.parseRequest(request);
  18. for (FileItem fileItem : fileItems) {
  19. //3. 调用FileItem中isFormField(),查找文件参数
  20. if(fileItem.isFormField() == false){
  21. String fName = fileItem.getName();
  22. String uuid = UUID.randomUUID().toString().replace("-", "");
  23. //文件参数,4. 调用FileItem中writer()方法,实现文件上传
  24. File file = new File(realPath+File.separator+uuid+fName);
  25. fileItem.write(file);
  26. }else{
  27. //普通参数
  28. }
  29. }
  30. response.getWriter().write("文件上传成功!");
  31. } catch (FileUploadBase.FileSizeLimitExceededException e) {
  32. response.getWriter().write("文件最大为100kb!");
  33. e.printStackTrace();
  34. }catch (Exception e) {
  35. e.printStackTrace();
  36. }

3. 实现文件下载思路

  • 准备下载资源
  • 创建输入流【FileInputStream】
  • 获取输出流【ServletOutputStream】
  • 边读边写

4. 实现文件下载代码

  1. request.setCharacterEncoding("UTF-8");
  2. response.setContentType("text/html;charset=UTF-8");
  3. //获取下载资源文件名
  4. String fileName = request.getParameter("fileName");
  5. //获取文件本地真实路径
  6. String realPath = getServletContext().getRealPath("/WEB-INF/download/" + fileName);
  7. System.out.println("realPath = " + realPath);
  8. File file = new File(realPath);
  9. //创建输入流【FileInputStream】
  10. FileInputStream fis = new FileInputStream(file);
  11. //边读边写【设置】
  12. //设置浏览器响应体文件类型
  13. String mimeType = request.getServletContext().getMimeType(fileName);
  14. response.setContentType(mimeType);
  15. //解决文件名中文乱码问题
  16. String header = request.getHeader("User-Agent");
  17. if(header != null && header.contains("Firefox")) {
  18. fileName = "=?utf-8?B?"+new BASE64Encoder().encode(fileName.getBytes("utf-8"))+"?=";
  19. }else {
  20. fileName = URLEncoder.encode(fileName, "UTF-8");
  21. }
  22. //设置浏览器响应体内容格式,为附件格式。(告诉浏览器,文件为附件,别打开,下载。)
  23. response.setHeader("Content-Disposition", "attachment; filename="+fileName);
  24. //获取输出流【ServletOutputStream】
  25. ServletOutputStream ops = response.getOutputStream();
  26. //边读边写
  27. byte[] b = new byte[1024];
  28. int len;
  29. while((len=fis.read(b))>0){
  30. ops.write(b,0,len);
  31. }
  32. ops.close();
  33. fis.close();