关于PHP输出文件给浏览器下载时的编码问题
2009-08-01
做文件管理器的时候会遇到让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)完。
5519 read 4 comment(s)