$name = rawurlencode( '产品说明书_v2.pdf' );
header( "Content-Disposition: attachment; filename=\"manual.pdf\"; filename*=UTF-8''{$name}" );

下载产品说明书_v2.pdf,保存到本地变成一串拉丁字母乱码,Chrome 和 Edge 都一样,手机浏览器直接变成 download.bin。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,响应头只写了 filename= 原始中文,HTTP 头按 ISO-8859-1 解析,UTF-8 字节被当成单字节字符。没有提供 filename* 的编码版本。

「Content-Disposition 编码」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

处理上按这个顺序:响应头同时给 filename 和 filename*,后者用 UTF-8'' 加 urlencode;文件名里的空格和括号统一转义,别直接拼;三个浏览器各下一次,确认文件名完整显示。

改完只确认一件事:下载后的文件名显示为产品说明书_v2.pdf,不再出现乱码。

作者 9823189