Content-Disposition: attachment;
  filename="report.csv";
  filename*=UTF-8''%E6%8A%A5%E8%A1%A8.csv

导出的报表下载后文件名变成一串百分号编码,用户不知道是哪个文件。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,响应头里直接放了原始中文,浏览器按 ASCII 解析导致乱码。

这次卡住的地方就在「下载文件名乱码」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:使用兼容写法的文件名编码;同时给出 ASCII 回退名;确认响应头未被框架二次编码。

改完只确认一件事:下载后的文件名显示为中文,主流浏览器表现一致。

作者 9823189