文件上传

文件上传前端页面:

  • 使用 form 标签,请求方式为 post
  • form 的 enctype 设置为 multipart/form-date,即设置表单的类型为文件上传表单(form 表单的默认类型为 application/x-www-form-urlencoded)
  • 文件标签设置 name 属性值

前台页面:

  1. <form method="post" enctype="multipart/form-data" action="/upload">
  2. 文件名:<input type="text" name="filename"><br/>
  3. 文件:<input type="file" name="file"><br/>
  4. <button type="submit">上传</button>
  5. </form>

后台服务端:使用注解 @MultipartConfig 将一个 Servlet 标识为文件上传,Servlet 将 multipart/form-data 的 POST 请求封装成 Part,通过 Part 对上传的文件进行操作

  1. @MultipartConfig // 文件上传表单
  2. @WebServlet("/upload")
  3. public class UpLoad extends HttpServlet {
  4. @Override
  5. protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  6. // 设置请求的编码格式
  7. request.setCharacterEncoding("UTF-8");
  8. // 获取普通表单项(文本框)
  9. String filename = request.getParameter("filename");
  10. // 通过getPart(name)方法获取Part对象(name代表的是页面中file文件域的name属性值)
  11. Part part = request.getPart("file");
  12. // 通过Part对象,获取上传的文件名
  13. String fileName = part.getSubmittedFileName();
  14. // 获取上传文件需要存放的位置(得到项目存放的真实路径)
  15. String realPath = request.getServletContext().getRealPath("/");
  16. // 将文件上传到指定位置
  17. part.write(realPath + fileName);
  18. }
  19. }

文件下载

文件下载,即将服务器上的资源下载(拷贝)到本地,可以通过两种方式下载:

  • 超链接进行下载
  • 通过代码下载

1、超链接下载:在html或jsp页面中使用 a 标签时,当超链接遇到浏览器不识别的资源时会自动下载,也可以使用download属性规定浏览器进行下载

  1. <a href="test.zip">超链接下载</a>
  2. <!-- 使用download属性指定:download不写任何信息时,使用默认文件名,设置了值时,使用设置的值作为文件名 -->
  3. <a href="test.zip" download>超链接下载</a>

2、后台实现下载:

  • 通过 response.setContentType 方法设置 Content-type 头字段的值,为浏览器无法使用某种方式激活某个程序来处理的MIME类型,例如application/octet-stream 或 application/x-msdownload 等
  • 需要通过 response.setHeader 方法设置 Content-Disposition 头的值为 attachment;filename=文件名
  • 读取下载文件,调用 response.getOutputStream 方法向客户端写入附件内容

    1. @WebServlet("/download")
    2. public class Download extends HttpServlet {
    3. @Override
    4. protected void service(HttpServletRequest request, HttpServletResponse response)
    5. throws ServletException, IOException {
    6. // 设置请求的编码
    7. request.setCharacterEncoding("UTF-8");
    8. // 获取文件下载路径
    9. String path = this.getServletContext().getRealPath("/");
    10. // 获取要下载的文件名
    11. String name = request.getParameter("filename");
    12. // 通过路径得到file对象
    13. File file = new File(path + name);
    14. // 判断file对象是否存在,且是否一个标准文件
    15. if (file.exists() && file.isFile()) {
    16. // 设置响应类型(浏览器无法使用某种方式或激活某个程序来处理的类型)
    17. response.setContentType("application/x-msdownload");
    18. // 设置头信息
    19. response.setHeader("Content-Disposition",
    20. "attachment;filename=" + name);
    21. // 得到输入流
    22. FileInputStream fis = new FileInputStream(file);
    23. // 得到输出流
    24. ServletOutputStream os = response.getOutputStream();
    25. // 定义byte数组
    26. byte[] bytes = new byte[1024];
    27. int read = 0;
    28. while ((read = fis.read(bytes)) != -1) {
    29. os.write(bytes, 0, read);
    30. }
    31. // 冲刷输出流
    32. os.flush();
    33. fis.close();
    34. os.close();
    35. }
    36. }
    37. }

    通过在浏览器输入以下访问地址:127.0.0.1:8080/download?filename=文件名 就能实现下载
    使用 cmd 的 cURL 进行测试,结果如下:
    image.png