You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:36:17