19.Spring MVC文件下载

文件下载

文件下载的含义十分简单,它指的就是将服务器中的文件下载到本机上。

下面我们就结合一个实例,来演示下如何在 Spring MVC 中实现文件的下载功能,可以分为以下步骤。

1. 在《Spring MVC文件上传》一节中创建的 springmvc-file-demo 的工程中,修改 success.html 的代码,在每个图片下面添加一个文件下载的超链接,代码如下。

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h1>学生信息上传成功</h1>
  9.  
  10. <table>
  11. <tr>
  12. <td>学号:</td>
  13. <td th:text="${student.getStuId()}"></td>
  14. </tr>
  15.  
  16. <tr>
  17. <td>姓名:</td>
  18. <td th:text="${student.getStuName()}"></td>
  19. </tr>
  20. <tr>
  21. <td>年龄:</td>
  22. <td th:text="${student.getAge()}"></td>
  23. </tr>
  24. <tr>
  25. <td>照片:</td>
  26. <td th:each="p:${student.getPath()}">
  27. <img th:src="${#servletContext.getContextPath()}+'/upload/'+${p}" width='200px' height='200px'/><br>
  28. <!--图片下载的超链接-->
  29. <a th:href="@{/downLoadFile(fileName=${p})}">点击下载图片</a>
  30. </td>
  31. </tr>
  32. </table>
  33. </body>
  34. </html>


2. 在net.biancheng.c.controller 包下新建一个名为 DownLoadController 的控制器类,代码如下。

  1. package net.biancheng.c.controller;
  2.  
  3. import org.apache.commons.io.FileUtils;
  4. import org.springframework.http.HttpHeaders;
  5. import org.springframework.http.HttpStatus;
  6. import org.springframework.http.MediaType;
  7. import org.springframework.http.ResponseEntity;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10.  
  11. import javax.servlet.http.HttpServletRequest;
  12. import java.io.File;
  13. import java.io.IOException;
  14. import java.io.UnsupportedEncodingException;
  15.  
  16. @Controller
  17. public class DownLoadController {
  18.  
  19.     /**
  20.      * 文件下载
  21.      *
  22.      * @param request
  23.      * @param fileName
  24.      * @return
  25.      * @throws IOException
  26.      */
  27.     @RequestMapping("/downLoadFile")
  28.     public ResponseEntity<byte[]> downLoadFile(HttpServletRequest request, String fileName) throws IOException {
  29.         //得到图片的实际路径
  30.         String realPath = request.getServletContext().getRealPath("/upload/" + fileName);
  31.         //创建该图片的对象
  32.         File file = new File(realPath);
  33.         //将图片数据读取到字节数组中
  34.         byte[] bytes = FileUtils.readFileToByteArray(file);
  35.         //创建 HttpHeaders 对象设置响应头信息
  36.         HttpHeaders httpHeaders = new HttpHeaders();
  37.         //设置图片下载的方式和文件名称
  38.         httpHeaders.setContentDispositionFormData("attachment", toUTF8String(fileName));
  39.         httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
  40.         return new ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK);
  41.     }
  42.  
  43.  
  44.     /**
  45.      * 下载保存时中文文件名的字符编码转换方法
  46.      */
  47.     public String toUTF8String(String str) {
  48.         StringBuffer sb = new StringBuffer();
  49.         int len = str.length();
  50.         for (int i = 0; i < len; i++) {
  51.             // 取出字符中的每个字符
  52.             char c = str.charAt(i);
  53.             // Unicode码值为0~255时,不做处理
  54.             if (c >= 0 && c <= 255) {
  55.                 sb.append(c);
  56.             } else { // 转换 UTF-8 编码
  57.                 byte b[];
  58.                 try {
  59.                     b = Character.toString(c).getBytes("UTF-8");
  60.                 } catch (UnsupportedEncodingException e) {
  61.                     e.printStackTrace();
  62.                     b = null;
  63.                 }
  64.                 // 转换为%HH的字符串形式
  65.                 for (int j = 0; j < b.length; j++) {
  66.                     int k = b[j];
  67.                     if (k < 0) {
  68.                         k &= 255;
  69.                     }
  70.                     sb.append("%" + Integer.toHexString(k).toUpperCase());
  71.                 }
  72.             }
  73.         }
  74.         return sb.toString();
  75.     }
  76. }


在 DownLoadController 类中共包含以下 2 个方法:

  • downLoadFile() 方法:负责文件的下载工作,我们首先根据文件路径和文件名称创建一个 File 对象,然后对响应头中文件的打开方式和下载方式进行了设置,并通过 ResponseEntity 对下载结果对象进行封装。
  • toUTF8String() 方法:负责完成中文文件名的字符编码转换。

ResponseEntity 对象与前面的章节中介绍的 @ResponseBody 注解相似,它也是用来直接返回结果对象的。

3. 重启 Tomcat 服务服务器,使用浏览器访问“http://localhost:8080/springmvc-file-demo/”,填写学生信息并上传图片,结果如下。


图1:图片上传成功


4. 点击图片下方的“点击下载图片”的超链接,下载对应的图片,结果如下图。

下载图片
图2:点击链接下载图片
posted @ 2022-07-31 14:39  随遇而安==  阅读(157)  评论(0编辑  收藏  举报