@GetMapping("/downloadOrderDemo") public ResponseEntity<Resource> downloadFile() throws IOException { // 读取文件内容 File file = new File(System.getProperty("user.dir") + File.separator + "work-order/src/main/java/com/workorder/file/模版.xlsx"); InputStreamResource resource = new InputStreamResource(new FileInputStream(file)); // 设置 HTTP 响应头信息 HttpHeaders headers = new HttpHeaders(); String fileName = "模版.xlsx"; String encodedFileName = URLEncoder.encode(fileName, "UTF-8"); headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFileName); // 返回文件内容 return ResponseEntity.ok() .headers(headers) .contentLength(file.length()) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(resource); }
1.上述代码中,@GetMapping("/download")
注解指定了这是一个 GET 请求,并且路径为 /file/download
。ResponseEntity<Resource>
类型的返回值表示该接口会返回一个文件资源。在接口的实现中,我们首先读取文件内容,然后设置 HTTP 响应头信息,最后将文件内容封装在 ResponseEntity
中返回。
需要注意的是,上述代码中的文件路径是硬编码在代码中的,实际应用中应该将其配置在配置文件中或者通过其他方式动态获取。另外,上述代码中使用了 InputStreamResource
类来将文件内容转换为 Resource
,这是 Spring 框架提供的一个抽象类,用于表示任何可以被读取的资源。如果你的应用需要支持大文件下载,可以使用 StreamingResponseBody
类来实现。
2.在上述代码中,首先使用 URLEncoder.encode
方法对文件名进行 UTF-8 编码,然后将编码后的文件名添加到 HTTP 响应头的 Content-Disposition
属性中。需要注意的是,由于 RFC 6266 规范建议使用 RFC 5987 格式来传递编码后的文件名,因此上述代码中使用了 filename*=UTF-8''
来指定编码方式。