
最近排查一个 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开发 #文件下载 #中文乱码 #后台系统