Java文件下载代码及中文文件名不显示的问题
@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'' 来指定编码方式。

浙公网安备 33010602011771号