解析如何在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 相关文章推荐
使用TinyButStrong模板引擎来做WEB开发
Mar 16 PHP
PHP提取中文首字母
Apr 09 PHP
功能齐全的PHP发送邮件类代码附详细说明
Jul 10 PHP
php 缓存函数代码
Aug 27 PHP
PHP中的array数组类型分析说明
Jul 27 PHP
PHP中的float类型使用说明
Jul 27 PHP
二招解决php乱码问题
Mar 25 PHP
php+ajax实现无刷新的新闻留言系统
Dec 21 PHP
Zend Framework实现多服务器共享SESSION数据的方法
Mar 22 PHP
Yii框架连接mongodb数据库的代码
Jul 27 PHP
thinkPHP中session()方法用法详解
Dec 08 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
Oct 21 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
不用数据库的多用户文件自由上传投票系统(1)
2006/10/09 PHP
一篇入门的php Class 文章
2007/04/04 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
PHP 数组基本操作方法详解
2016/06/17 PHP
一个可以显示阴历的JS代码
2007/03/05 Javascript
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
jQuery插件简单实现方法
2015/07/18 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
mac上node.js环境的安装测试
2017/07/03 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
简单快速的实现js计算器功能
2017/08/17 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
vue实现简单跑马灯效果
2020/05/25 Javascript
[55:56]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
python通过ssh-powershell监控windows的方法
2015/06/02 Python
Python持续监听文件变化代码实例
2020/07/22 Python
python中pdb模块实例用法
2021/01/15 Python
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
海量信息软件测试笔试题
2015/08/08 面试题
房地产管理毕业生自荐信
2013/11/04 职场文书
营业员演讲稿
2013/12/30 职场文书
数控专业自荐书范文
2014/03/16 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
一帮一活动总结
2014/05/08 职场文书
消防安全宣传口号
2014/06/10 职场文书
机关作风建设工作总结
2014/10/23 职场文书
2015年业务员工作总结范文
2015/04/07 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书