ResponseEntity返回下载文件时文件名扩展名多出下划线_问题修复
问题原因
你错误使用了HttpHeaders的setContentDispositionFormDataAPI,是导致文件名末尾多下划线的核心原因。
这个方法的参数定义为:第一个参数接收表单字段的name属性值,第二个参数接收文件名,你直接把拼接好的完整Content-Disposition规则字符串作为第一个参数传入、第二个参数传null,会导致Spring构造出不符合HTTP规范的响应头,浏览器无法正确解析文件名时,会自动在文件名末尾追加下划线做容错处理。
你当前错误写法生成的响应头大致如下,完全不符合附件下载的头规范:
Content-Disposition: form-data; name="attachment; filename=sample1.pdf"; filename=
修复方案
方案1:正确调用setContentDispositionFormData API
直接按API参数定义传值即可,第一个参数固定传attachment标识这是附件下载,第二个参数传入真实文件名:
// 替换原来错误的setContentDispositionFormData调用 respHeaders.setContentDispositionFormData("attachment", newFile.getName());
如果需要兼容中文文件名、适配不同版本浏览器,推荐用第二种更可控的写法。
方案2:手动构造标准Content-Disposition响应头
手动设置响应头,同时兼容RFC5987编码规范,避免中文文件名乱码、特殊字符解析异常问题:
import java.net.URLEncoder; import java.nio.charset.StandardCharsets; // 替换原来错误的setContentDispositionFormData调用 String rawFileName = newFile.getName(); // 对文件名做URL编码,处理空格、中文等特殊字符 String encodedFileName = URLEncoder.encode(rawFileName, StandardCharsets.UTF_8) .replaceAll("\\+", "%20"); respHeaders.set(HttpHeaders.CONTENT_DISPOSITION, String.format("attachment; filename=\"%s\"; filename*=UTF-8''%s", encodedFileName, encodedFileName));
验证方式
修改代码后重启服务,触发下载时打开浏览器开发者工具,在「网络」面板找到对应下载请求,检查响应头里的Content-Disposition字段,值为attachment; filename="sample1.pdf"格式即为正常,此时下载的文件名不会再出现多余下划线。
内容的提问来源于stack exchange,提问作者Ajay Kumar
相关产品推荐
相关产品推荐

