解析如何在PHP下载文件名中解决乱码的问题


Posted in PHP onJune 20, 2013

通过把Content-Type设置为application/octet-stream,可以把动态生成的内容当作文件来下载,相信这个大家都会。那么用Content-Disposition设置下载的文件名,这个也有不少人知道吧。基本上,下载程序都是这么写的:

$filename = "document.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>

但是,如果$filename是UTF-8编码的,有些浏览器就无法正常处理了。比如把上面那个程序稍稍改一下:
$filename = "中文 文件名.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>

输出的header实际上是这样子:
Content-Disposition: attachment; filename=中文 文件名.txt其实按照RFC2231的定义,多语言编码的Content-Disposition应该这么定义:
Content-Disposition: attachment; filename*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"即:
•filename后面的等号之前要加 *
•filename的值用单引号分成三段,分别是字符集(utf8)、语言(空)和urlencode过的文件名。
•最好加上双引号,否则文件名中空格后面的部分在Firefox中显示不出来
•注意urlencode的结果与php的urlencode函数结果不太相同,php的urlencode会把空格替换成+,而这里需要替换成%20
经过试验,发现几种主流浏览器的支持情况如下:
IE6
attachment; filename=""
FF3
attachment; filename="UTF-8文件名"
attachment; filename*="utf8''"
O9
attachment; filename="UTF-8文件名"
Safari3(Win)
貌似不支持?上述方法都不行
这样看来,程序必须得这样写才能支持所有主流浏览器:
$ua = $_SERVER["HTTP_USER_AGENT"];
$filename = "中文 文件名.txt";
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
header('Content-Type: application/octet-stream');
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header('Content-Disposition: attachment; filename*="utf8/'/'' . $filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
print 'ABC';
?>
PHP 相关文章推荐
关于Intype一些小问题的解决办法
Mar 28 PHP
PHP 在线翻译函数代码
May 07 PHP
php设计模式 Proxy (代理模式)
Jun 26 PHP
使用php实现截取指定长度
Aug 06 PHP
利用php下载xls文件(自己动手写的)
Apr 18 PHP
浅谈Eclipse PDT调试PHP程序
Jun 09 PHP
详解php中空字符串和0之间的关系
Oct 23 PHP
php实现解析xml并生成sql语句的方法
Feb 03 PHP
PHP实现微信红包金额拆分试玩的算法示例
Apr 07 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
Sep 26 PHP
php让json_encode不自动转义斜杠“/”的方法
Apr 27 PHP
php优化查询foreach代码实例讲解
Mar 24 PHP
解析smarty 截取字符串函数 truncate的用法介绍
Jun 20 #PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
Jun 20 #PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
Jun 20 #PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 #PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 #PHP
用Json实现PHP与JavaScript间数据交换的方法详解
Jun 20 #PHP
使用php 获取时间今天明天昨天时间戳的详解
Jun 20 #PHP
You might like
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
2016/03/14 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
PHP时间类完整代码实例
2021/02/26 PHP
javascript下给元素添加事件的方法与代码
2007/08/13 Javascript
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
简单实现IONIC购物车功能
2017/01/10 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
2018/07/31 NodeJs
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
Python文件操作基本流程代码实例
2017/12/11 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
Python基于smtplib模块发送邮件代码实例
2020/05/29 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
艺术节主持词
2014/04/02 职场文书
土地租赁协议书
2015/01/29 职场文书
质检员岗位职责
2015/02/03 职场文书
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
Go获取两个时区的时间差
2022/04/20 Golang