解析如何在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 相关文章推荐
最小化数据传输――在客户端存储数据
Oct 09 PHP
PHP求最大子序列和的算法实现
Jun 24 PHP
Zend studio文件注释模板设置方法
Sep 29 PHP
测试php函数的方法
Nov 13 PHP
PHPMailer的主要功能特点和简单使用说明
Feb 17 PHP
php写的AES加密解密类分享
Jun 20 PHP
PHP中foreach()用法汇总
Jul 02 PHP
Smarty模板变量调节器用法分析
May 23 PHP
thinkPHP模板引擎用法示例
Dec 08 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 01 PHP
php微信公众号开发之校园图书馆
Oct 20 PHP
thinkphp5修改view到根目录实例方法
Jul 02 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中文乱码
2009/11/26 PHP
获取URL文件名后缀
2013/10/24 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
微信js-sdk地理位置接口用法示例
2016/10/12 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
vue实现分页的三种效果
2020/06/23 Javascript
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
python3.4.3下逐行读入txt文本并去重的方法
2018/04/29 Python
python用match()函数爬数据方法详解
2019/07/23 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
《在大海中永生》教学反思
2014/02/24 职场文书
艺校音乐专业自我鉴定范文
2014/03/01 职场文书
小学社会实践活动总结
2014/07/03 职场文书
幼儿园端午节活动方案
2014/08/25 职场文书
2014离婚协议书范文
2014/09/10 职场文书
校园运动会广播稿
2014/10/06 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书
普通党员整改措施
2014/10/24 职场文书
2015年办公室文员工作总结
2015/04/24 职场文书