Springboot下载文件, 文件名中文是乱码, 空格变加号

默认把文件名放上去, 中文会乱码, 文件名种有空格, 就会被截断

public void download(HttpServletResponse response){
    // 文件名先进行url编码, 避免乱码问题
    // 把+用%20进行替换
    fileName = URLEncoder.encode(fileName, "UTF-8").replace("+", "%20");
    response.setContentType("application/octet-stream");
    // 注意是 filename*=utf-8''
    response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + "." + fileRecord.getFileFormat());

}

不能直接把空格替换成%20, 因为%会被url编码转成%25, 虽然可以再手动替换回来, 但太麻烦了

就先url编码, 再替换+号即可

参考: https://blog.csdn.net/minshiwang/article/details/105393649

### Java URLEncoder.encode 方法使用问题及其解决方案 #### 1. 现象描述 当使用 `URLEncoder.encode` 对字符串进行 URL 编码时,空格会被替换为加号 (`+`) 而不是 `%20`。这可能导致某些场景下不符合预期的行为[^1]。 #### 2. 原因分析 根据标准的 URI 编码规则,空格应该被编码为 `%20`。然而,`URLEncoder.encode` 的设计遵循的是 HTML 表单提交的标准(application/x-www-form-urlencoded),在这种情况下,空格会被转换成加号 (`+`)。因此,如果需要严格遵守 URI 编码规范,则需要额外处理这个问题[^2]。 #### 3. 解决方案 以下是几种常见的解决方案: ##### 方案一:手动替换加号为 `%20` 可以通过正则表达式或者简单的字符串操作将编码后的结果中的加号替换成 `%20`。这种方法简单易实现,但不够优雅。 ```java import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class Test { public static void main(String[] args) throws UnsupportedEncodingException { String val = "111 222+333 "; // 使用 URLEncoder 进行编码 String encode = URLEncoder.encode(val, "utf-8"); System.out.println("原始编码:" + encode); // 将 "+" 替换为 "%20" String rst = encode.replaceAll("\\+", "%20"); System.out.println("最终结果:" + rst); } } ``` ##### 方案二:使用 Spring 提供的 `UriUtils` Spring 框架提供了更灵活的工具类 `UriUtils`,可以直接替代 `URLEncoder` 并正确处理空格和其他特殊字符。 ```java import org.springframework.web.util.UriUtils; public class MainTest { public static void main(String[] args) throws Exception { String content = "Hello <springboot中文社区>"; // 使用 UriUtils 进行编码 String result = UriUtils.encode(content, "utf-8"); System.out.println("UriUtils 编码结果:" + result); } } ``` 此方法的优点在于无需手动调整编码结果,直接满足 URI 编码的需求[^3]。 ##### 方案三:针对浏览器兼容性的特殊处理 在文件下载等场景中,不同浏览器可能对编码方式有不同的要求。例如,Firefox 和 IE 浏览器对于文件名的编码支持存在差异。此时可以根据请求头中的 User-Agent 字段动态选择合适的编码策略。 ```java import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class BrowserCompatibilityExample { public static void setFileName(HttpServletResponse response, String oldFilename, String userAgent) throws UnsupportedEncodingException { String encodedFileName; if (userAgent.contains("MSIE")) { encodedFileName = "=" + URLEncoder.encode(oldFilename, "utf-8").replaceAll("\\+", "%20"); } else { encodedFileName = "*=utf-8''" + URLEncoder.encode(oldFilename, "utf-8").replaceAll("\\+", "%20"); } response.setHeader("Content-Disposition", "attachment; filename=" + encodedFileName); } } ``` 这种方式能够有效应对跨浏览器的兼容性问题[^4]。 --- ### 总结 通过上述三种方案,可以选择适合具体业务需求的方式来解决 `URLEncoder.encode` 中空格加号的问题。推荐优先考虑使用第三方库(如 Spring 的 `UriUtils`)以减少自定义逻辑带来的复杂性和潜在风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值