返回

Spring Boot 下载文件文件名中文乱码?不会再有这种烦恼了!

后端

解决 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 文件下载文件名中文乱码问题。文件名中文乱码不再是困扰,文件下载从此畅通无阻。

常见问题解答:

  1. 为什么使用 Swagger 会导致文件名中文乱码?
    答:Swagger 对请求参数进行 URL 编码,而文件名作为请求参数的一部分,也会被编码。

  2. 如何设置文件编码?
    答:在 application.properties 文件中添加 spring.http.encoding.charset=UTF-8

  3. Content-Type 头的作用是什么?
    答:Content-Type 头指定文件的类型,如纯文本、JSON 或二进制文件。

  4. 文件名如何与实际文件名称一致?
    答:通过 response.setHeader() 方法设置文件名,确保下载后文件名称正确。

  5. 文件编码的重要性是什么?
    答:文件编码决定了下载文件的字符集,确保文件内容的正确显示。