Spring MVC 提供了一个 ResponseEntity 类型,使用它可以很方便地定义返回 HttpHeaders 和 HttpStatus ,以实现下载功能。
@RequestMapping("/download")
public ResponseEntity<byte[]> download(
HttpServletRequest req,
@RequestParam("filename") String filename,
Model model) throws Exception {
// 1. 准备一个字节数组(字节数组的内容来源于一个文件)。
// 这个字节数组,就是在本次 HTTP 请求中 Tomcat 要回给客户端浏览器的内容、数据。
String path = req.getServletContext().getRealPath("upload");
File file = new File(path + File.separator + filename);
byte[] bytes = FileUtils.readFileToByteArray(file);
// 2. 创建一个 ResponseEntity 对象。它代表着一个 HTTP 响应。
// 而一个 HTTP 响应又有行-头-体。其中『体』里存放的就是上述的代表文件内容的字节数组
HttpHeaders headers = new HttpHeaders();
// 解决文件名乱码问题
// String downloadFileName = new String(filename.getBytes("UTF-8"), "iso-8859-1");
// 第一个放在 header 中的键值对 attachment=xxx
headers.setContentDispositionFormData("attachment", filename);
// 第二个放在 header 中的键值对 media-type=xxxx
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(
bytes, // 响应体中携带的数据
headers, // 响应头
HttpStatus.OK); // 响应行中的状态码
return responseEntity;
}