Content-Disposition: attachment; filename="orders.xlsx";
  filename*=UTF-8''%E8%AE%A2%E5%8D%95%E6%98%8E%E7%BB%86.xlsx

Chrome 下载导出文件叫 订单明细_20261114.xlsx,Safari 里只剩 订单 两个字,扩展名也没了,用户以为是坏文件。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,响应头同时写了 filename 和 filename*,filename 里直接放原始 UTF-8 字节,Safari 按 Latin-1 解析并在空格处截断。filename* 的编码格式也写错了。

「filename 文件名截断」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。

处理上按这个顺序:filename 放纯 ASCII 兜底名 例如 orders.xlsx;filename* 按 RFC 5987 写 UTF-8'' 加百分号编码;两个参数都保留 用分号隔开 分别用 Chrome 和 Safari 各下一次。

改完只确认一件事:Safari 下载的文件名完整显示 订单明细.xlsx,Chrome 结果一致,扩展名正常。

作者 9823189