解析如何在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 相关文章推荐
PHP判断文件是否存在、是否可读、目录是否存在的代码
Oct 03 PHP
is_uploaded_file函数引发的不能上传文件问题
Oct 29 PHP
php读取csv实现csv文件下载功能
Dec 18 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
php采用ajax数据提交post与post常见方法总结
Nov 10 PHP
php将字符串全部转换成大写或者小写的方法
Mar 17 PHP
Smarty保留变量用法分析
May 23 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
Feb 25 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
php 广告点击统计代码(php+mysql)
Feb 21 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
Sep 08 PHP
laravel框架与其他框架的详细对比
Oct 23 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
多数据表共用一个页的新闻发布
2006/10/09 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
javascript对象的property和prototype是这样一种关系
2007/03/24 Javascript
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
从零学习node.js之利用express搭建简易论坛(七)
2017/02/25 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
python自动12306抢票软件实现代码
2018/02/24 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
对python中Json与object转化的方法详解
2018/12/31 Python
pyqt5之将textBrowser的内容写入txt文档的方法
2019/06/21 Python
简单了解python元组tuple相关原理
2019/12/02 Python
用 Python 制作地球仪的方法
2020/04/24 Python
python中封包建立过程实例
2021/02/18 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
Ejb技术面试题
2015/04/29 面试题
师范生实习个人的自我评价
2013/09/28 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
新员工辞职信范文
2015/05/12 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
教你如何使用Python实现二叉树结构及三种遍历
2021/06/18 Python
python中24小时制转换为12小时制的方法
2021/06/18 Python
教你使用Python获取QQ音乐某个歌手的歌单
2022/04/03 Python