关于PHP输出文件给浏览器下载时的编码问题

日期:2009年8月1日 添加评论

    做文件管理器的时候会遇到让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)

相关文章:


分类:程序们
标签:
  1. 2009年8月15日 at 20:20 | #1

    抢到沙发了

  2. 2009年9月16日 at 17:32 | #2

    你的文件管理器也不升级了。。。

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

    那一句在哪儿添加?

  3. 2009年11月9日 at 09:06 | #3

    文件名统一使用utf-8编码,需要把所有的
    header(”Content-type:TEXT/HTML;Charset=GB2312″);
    改成 header(”Content-type:TEXT/HTML;Charset=utf-8″);
    么??

  4. 2009年11月9日 at 14:32 | #4

    回复 sparrow:
    下载文件是不能发上面那个header的。上面那个header只能用于显示网页的时候用。

  1. 还没有 trackbacks
订阅评论
视觉系火星播报河蟹娱乐朝花夕拾牛人很牛灰太狼软白沙八月洗澡火影那些事儿热豆腐