关于PHP输出文件给浏览器下载时的编码问题
August/1st 2009
    做文件管理器的时候会遇到让PHP输出一个文件给浏览器下载。我们都知道要发一下一些header:

$filename = "下载文件名";
$filesize = filesize('文件地址'); //获得文件大小
header('Pragma: public');
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: pre-check=0, post-check=0, max-age=0');
header('Content-Transfer-Encoding: binary');
header('Content-Encoding: none');
header('Content-type: application/force-download');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-length: '.$filesize);
然后再用readfile把文件内容输出给浏览器。但是会遇到一个很烦的问题:弹出文件下载框时,显示的文件名在不同的浏览器下面是不一样的。有的是乱码,有的是空白。 为了解决这个问题,我找了查了很多资料。最终找到一个好的解决办法: 文件名统一使用utf-8编码,然后针对ie浏览器进行一次rawurlencode编码。 比如: if (preg_match('/MSIE/',$_SERVER['HTTP_USER_AGENT'])) $filename = rawurlencode($filename); 这样在不同操作系统,不同浏览器里面,下载文件的时候,中文文件名都能正确显示了。 测试通过:Safari4(MAC) ,Firefox3.5(MAC), Firefox3(Win), IE7/8(Win), Chrome(Win)

5520 read 4 comment(s)
#1
仁心博客   2009年08月15号 12:20       回复
抢到沙发了
#2
cheen.cn   2009年09月16号 09:32       回复
你的文件管理器也不升级了。。。


if (preg_match(’/MSIE/’,$_SERVER['HTTP_USER_AGENT'])) $filename = rawurlencode($filename);

那一句在哪儿添加?
#3
sparrow   2009年11月09号 01:06       回复
文件名统一使用utf-8编码,需要把所有的    
header("Content-type:TEXT/HTML;Charset=GB2312");
改成    header("Content-type:TEXT/HTML;Charset=utf-8");
么??
#4
longbill   2009年11月09号 06:32       回复
回复 sparrow: 
下载文件是不能发上面那个header的。上面那个header只能用于显示网页的时候用。
添加新的评论
称呼:*
邮件:*
网站:
内容:

Copyright © Longbill 2008-2025 , Designed by EndTo , Powered by EndCMS