Spring Boot 下载文件文件名中文乱码?不会再有这种烦恼了!
2023-08-14 21:37:42
解决 Spring Boot 文件下载文件名中文乱码
困扰:
使用 Spring Boot 进行文件下载时,经常遭遇令人头疼的文件名中文乱码问题。这可能是由于多种原因造成的,包括 Swagger 对文件名进行 URL 编码、文件编码不当或下载路径错误。
解决之道:
1. 规避 Swagger 陷阱
Swagger 用于测试接口,可能会对文件名进行 URL 编码,导致下载时出现乱码。要解决这个问题,可在下载接口中使用 @RequestParam
注解指定文件名参数,并使用 URLEncoder.encode
对文件名进行 URL 编码。
@RequestMapping(value = "/downloadFile", method = RequestMethod.GET)
public void downloadFile(@RequestParam(value = "fileName", required = false) String fileName) throws IOException {
// 对文件名进行 URL 编码
fileName = URLEncoder.encode(fileName, "UTF-8");
// 后续文件下载处理代码
}
2. 正确设置文件编码
Spring Boot 内置的文件下载功能需要设置正确的文件编码。在 application.properties
文件中添加 spring.http.encoding.charset=UTF-8
,即可设置文件编码为 UTF-8。
spring.http.encoding.charset=UTF-8
3. 厘清下载路径
确保下载路径指向的文件存在且具有可读权限。如果路径错误,将导致文件下载失败。
4. 选用恰当的 Content-Type
下载文件时,需要根据文件类型选择正确的 Content-Type 头,如 text/plain
(纯文本文件)、application/json
(JSON 文件)或 application/octet-stream
(二进制文件)。
// 设置 Content-Type 为二进制文件
response.setContentType("application/octet-stream");
5. 使用正确的文件名
在下载文件中,文件名应与实际文件名称一致。通过 response.setHeader()
方法设置文件名,确保下载后文件名称正确。
// 设置文件名
response.setHeader("Content-Disposition", "attachment; filename=test.txt");
6. 精准设置文件编码
文件编码应与文件的实际编码一致。通过 response.setCharacterEncoding()
方法设置文件编码,保证下载文件的编码正确。
// 设置文件编码为 UTF-8
response.setCharacterEncoding("UTF-8");
结论:
通过上述措施,可以有效解决 Spring Boot 文件下载文件名中文乱码问题。文件名中文乱码不再是困扰,文件下载从此畅通无阻。
常见问题解答:
-
为什么使用 Swagger 会导致文件名中文乱码?
答:Swagger 对请求参数进行 URL 编码,而文件名作为请求参数的一部分,也会被编码。 -
如何设置文件编码?
答:在application.properties
文件中添加spring.http.encoding.charset=UTF-8
。 -
Content-Type 头的作用是什么?
答:Content-Type 头指定文件的类型,如纯文本、JSON 或二进制文件。 -
文件名如何与实际文件名称一致?
答:通过response.setHeader()
方法设置文件名,确保下载后文件名称正确。 -
文件编码的重要性是什么?
答:文件编码决定了下载文件的字符集,确保文件内容的正确显示。