Spring MVC 文件上传和下载-Spring MVC 中文件下载

时间:2024-04-10 10:55:34

Spring MVC 提供了一个 ResponseEntity 类型,使用它可以很方便地定义返回 HttpHeadersHttpStatus ,以实现下载功能。

@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;
}