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开发 #文件下载 #中文乱码 #后台系统

相关推荐
FRing0316 分钟前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
Fatbobman(东坡肘子)1 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
揽星河..1 小时前
【C语言】底层程序设计
c语言·开发语言
JavaPub-rodert2 小时前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
海的透彻3 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat3 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
北京中科新远科技3 小时前
高速交换机端口预算怎么做?下行、上联、拆分和冗余计算框架
开发语言·php
xiaoye-duck3 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
AI源码4 小时前
基于 Python 的短视频用户行为分析系统
开发语言·python
其实防守也摸鱼4 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php