解析如何在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 相关文章推荐
基于mysql的bbs设计(四)
Oct 09 PHP
mysql5详细安装教程
Jan 15 PHP
基于curl数据采集之正则处理函数get_matches的使用
Apr 28 PHP
PHP swfupload图片上传的实例代码
Sep 30 PHP
ThinkPHP无限级分类原理实现留言与回复功能实例
Oct 31 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
Sep 30 PHP
详解WordPress开发中wp_title()函数的用法
Jan 07 PHP
注意!PHP 7中不要做的10件事
Sep 18 PHP
Laravel实现自定义错误输出内容的方法
Oct 10 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
Apr 23 PHP
win10下 php安装seaslog扩展的详细步骤
Dec 04 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提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
2018/06/20 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
angularJS之$http:与服务器交互示例
2017/03/17 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
2017/04/14 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
Vue添加请求拦截器及vue-resource 拦截器使用
2017/11/23 Javascript
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
[01:27]2014DOTA2展望TI 剑指西雅图IG战队专访
2014/06/30 DOTA
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
Python 定义只读属性的实现方式
2020/03/05 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
抽象方法、抽象类怎样声明
2014/10/25 面试题
linux面试题参考答案(6)
2014/08/29 面试题
银行实习鉴定
2013/12/13 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
2015年党总支工作总结
2015/05/25 职场文书
宿舍管理制度范本
2015/08/07 职场文书
浅析Python OpenCV三种滤镜效果
2022/04/11 Python
Python创建SQL数据库流程逐步讲解
2022/09/23 Python