通過把ContentType設置為application/octetstream可以把動態生成的內容當作文件來下載相信這個大家都會那麼用ContentDisposition設置下載的文件名這個也有不少人知道吧基本上下載程序都是這麼寫的
header(
Content
Disposition: attachment; filename=
$filename);print
Hello!
;?>
這樣用浏覽器打開之後就可以下載documenttxt
但是如果$filename是UTF編碼的有些浏覽器就無法正常處理了比如把上面那個程序稍稍改一下
header(
Content
Disposition: attachment; filename=
$filename);print
Hello!
;?>
把程序保存成UTF編碼再訪問IE下載的文件名就會亂碼 FF下下載的文件名就只有中文兩個字Opera 下一切正常
輸出的header實際上是這樣子
Content
Disposition: attachment; filename=中文 文件名
txt
其實按照RFC的定義多語言編碼的ContentDisposition應該這麼定義
Content
Disposition: attachment; filename*=
utf
%E
%B
%AD%E
%
%
%
%E
%
%
%E
%BB%B
%E
%
%
D
txt
即
filename後面的等號之前要加 * filename的值用單引號分成三段分別是字符集(utf)語言(空)和urlencode過的文件名 最好加上雙引號否則文件名中空格後面的部分在Firefox中顯示不出來 注意urlencode的結果與php的urlencode函數結果不太相同php的urlencode會把空格替換成+而這裡需要替換成%
經過試驗發現幾種主流浏覽器的支持情況如下
IE attachment; filename=
FF attachment; filename=UTF文件名
attachment; filename*=utf
O attachment; filename=UTF文件名
Safari(Win) 貌似不支持?上述方法都不行
這樣看來程序必須得這樣寫才能支持所有主流浏覽器
$encoded_filename = urlencode($filename);$encoded_filename = str_replace(+ %
$encoded_filename);header(ContentType: application/octetstream);
if (preg_match(/MSIE/ $ua)) { header(ContentDisposition: attachment;
filename= $encoded_filename );} else if (preg_match(/Firefox/ $ua))
{ header(ContentDisposition: attachment; filename*=utf\\ $filename );}
else { header(ContentDisposition: attachment; filename= $filename );}print ABC;?>
From:http://tw.wingwit.com/Article/program/PHP/201311/21454.html