PHP中文文件名为什么乱码

最近排查一个 PHP 后台时遇到过这种情况:用户上传的文件在服务器里保存正常,中文文件名也没有问题,但点击下载后,浏览器显示出来的名称却变成乱码,有些文件甚至直接显示成一串百分号编码。

最开始以为是服务器字符集问题,检查 Nginx、PHP 和数据库以后都没有发现异常。继续看下载接口才发现,问题出在 Content-Disposition 响应头。

原来的代码直接返回:

filename="客户合同.pdf"

部分浏览器对响应头里的中文处理并不一致,所以中文文件名很容易出现乱码。

后来把下载文件名改成 UTF-8 编码方式,使用 filename*:

filename*=UTF-8''%E5%AE%A2%E6%88%B7%E5%90%88%E5%90%8C.pdf

同时保留一个英文兼容文件名,避免少数旧环境无法识别。

另外还把"服务器实际存储文件名"和"用户下载时看到的文件名"彻底分开。服务器继续使用系统生成的唯一文件名,数据库保存原始名称,下载接口根据记录动态生成响应头。

这样既能避免中文乱码,也不会因为同名文件造成覆盖。

现在做合同、报表、图片、附件下载时,我一般都会单独处理文件名编码。文件内容能正常下载,不代表下载体验就一定正常,响应头里的一个文件名处理不好,也会直接影响用户使用。

#PHP开发 #文件下载 #中文乱码 #后台系统

相关推荐
小黄人软件1 小时前
python 模块(Module)与包(Package)的区别,python xxx.py、python -m xxx 和 import xxx 三者的区别
开发语言·python
silvamux_1 小时前
大模型 API 单元测试怎么 mock 不误伤
单元测试·log4j·php
阿里嘎多学长1 小时前
2026-10-13 GitHub 热点项目精选
开发语言·程序员·github·代码托管
巧克力味的桃子1 小时前
复杂网络能控性鲁棒性研究进展
开发语言·网络·php
普通人62 小时前
php处理百度编辑器有误html
开发语言·编辑器·html·php·1024程序员节
沉下心来学鲁班2 小时前
具身智能入门:用 Python 让 MicroDuck 机器狗学会走路
开发语言·人工智能·python·机器人
geovindu2 小时前
rust: Chain of Responsibility Pattern (续)
开发语言·后端·设计模式·rust·责任链模式·行为模式
诚心呈意共享外卖配送系统2 小时前
多平台订单聚合系统的技术架构:接 API 只是开始
java·开发语言·架构·系统架构·创业创新
学逆向的2 小时前
C 浮点数e(科学计数法)
c语言·开发语言·网络安全