經過把Content-Type設置爲application/octet-stream, 能夠把動態生成的內容看成文件來下載,相信這個你們都會。 那麼用Content-Disposition設置下載的文件名, 這個也有很多人知道吧。 基本上,下載程序都是這麼寫的:
<?php $filename = "document.txt"; header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . $filename); print "Hello!"; ?> [/cdoe] 這樣用瀏覽器打開以後,就能夠下載document.txt。 可是,若是$filename是UTF-8編碼的,有些瀏覽器就沒法正常處理了。 好比把上面那個程序稍稍改一下: [code] <?php $filename = "中文 文件名.txt"; header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . $filename); print "Hello!"; ?> [/cdoe] 把程序保存成UTF-8編碼再訪問,IE6下載的文件名就會亂碼。 FF3下下載的文件名就只有「中文」兩個字。Opera 9下一切正常。 輸出的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="<URL編碼以後的UTF-8文件名>" FF3 attachment; filename="UTF-8文件名" attachment; filename*="utf8''<URL編碼以後的UTF-8文件名>" O9 attachment; filename="UTF-8文件名" Safari3(Win) 貌似不支持?上述方法都不行 這樣看來,程序必須得這樣寫才能支持全部主流瀏覽器: [code] <?php $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'; ?>