解析如何在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 相关文章推荐
asp和php下textarea提交大量数据发生丢失的解决方法
Jan 20 PHP
php 文件夹删除、php清除缓存程序
Aug 25 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
CI框架入门示例之数据库取数据完整实现方法
Nov 05 PHP
PHP网络操作函数汇总
May 18 PHP
PHP获取文件夹大小函数用法实例
Jul 01 PHP
PHP数组去重比较快的实现方式
Jan 19 PHP
php pdo oracle中文乱码的快速解决方法
May 16 PHP
深入理解PHP中的empty和isset函数
May 26 PHP
Smarty日期时间操作方法示例
Nov 15 PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 PHP
PHP PDOStatement::errorInfo讲解
Jan 31 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
一个简单的MySQL数据浏览器
2006/10/09 PHP
php上的memcache和memcached两个pecl库
2010/03/29 PHP
php使HTML标签自动补全闭合函数代码
2012/10/04 PHP
Zend Framework缓存Cache用法简单实例
2016/03/19 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
多种JQuery循环滚动文字图片效果代码
2020/06/23 Javascript
JavaScript中的操作符类型转换示例总结
2016/05/30 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
vue-quill-editor富文本编辑器简单使用方法
2018/09/21 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
Python随机数random模块使用指南
2016/09/09 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
初学python的操作难点总结(新手必看篇)
2017/08/03 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
python统计多维数组的行数和列数实例
2018/06/23 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
python之生成多层json结构的实现
2020/02/27 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
意大利网上购书网站:Libraccio.it
2021/02/03 全球购物
递归计算如下递归函数的值(斐波拉契)
2012/02/04 面试题
如何开发安全的AJAX应用
2014/03/26 面试题
计算机网络专业个人的自我评价
2013/10/17 职场文书
学生就业推荐信
2013/11/13 职场文书
会计出纳岗位职责
2013/12/25 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python