php做下載文件的實(shí)現(xiàn)代碼及文件名中亂碼解決方法
更新時(shí)間:2011年02月03日 14:34:14 作者:
php做下載文件的實(shí)現(xiàn)代碼及文件名中亂碼解決方法,需要的朋友可以參考下。
最近有人問我做下載文件的方法,對(duì)于php方法如下:
<?php
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=ins.jpg");
readfile("imgs/test_Zoom.jpg");
?>
第一行代碼是強(qiáng)制下載;
第二行代碼是給下載的內(nèi)容指定一個(gè)名字;
第三行代碼是把下載的內(nèi)容讀進(jìn)文件中。
如何在PHP下載文件名中解決亂碼
通過把Content-Type設(shè)置為application/octet-stream,可以把動(dòng)態(tài)生成的內(nèi)容當(dāng)作文件來下載,相信這個(gè)大家都會(huì)。那么用Content-Disposition設(shè)置下載的文件名,這個(gè)也有不少人知道吧?;旧?,下載程序都是這么寫的:
<?php
$filename = "document.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>
這樣用瀏覽器打開之后,就可以下載document.txt。
但是,如果$filename是UTF-8編碼的,有些瀏覽器就無法正常處理了。比如把上面那個(gè)程序稍稍改一下:
<?php
$filename = "中文 文件名.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>
把程序保存成UTF-8編碼再訪問,IE6下載的文件名就會(huì)亂碼。 FF3下下載的文件名就只有“中文”兩個(gè)字。Opera 9下一切正常。
輸出的header實(shí)際上是這樣子:
Content-Disposition: attachment; filename=中文 文件名.txt其實(shí)按照RFC2231的定義,多語言編碼的Content-Disposition應(yīng)該這么定義:
Content-Disposition: attachment; filename*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"
即:
filename后面的等號(hào)之前要加 *
filename的值用單引號(hào)分成三段,分別是字符集(utf8)、語言(空)和urlencode過的文件名。
最好加上雙引號(hào),否則文件名中空格后面的部分在Firefox中顯示不出來
注意urlencode的結(jié)果與php的urlencode函數(shù)結(jié)果不太相同,php的urlencode會(huì)把空格替換成+,而這里需要替換成%20
經(jīng)過試驗(yàn),發(fā)現(xiàn)幾種主流瀏覽器的支持情況如下:
IE6 attachment; filename="<URL編碼之后的UTF-8文件名>"
FF3 attachment; filename="UTF-8文件名"
attachment; filename*="utf8''<URL編碼之后的UTF-8文件名>"
O9 attachment; filename="UTF-8文件名"
Safari3(Win) 貌似不支持?上述方法都不行
這樣看來,程序必須得這樣寫才能支持所有主流瀏覽器:
<?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';
?>
復(fù)制代碼 代碼如下:
<?php
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=ins.jpg");
readfile("imgs/test_Zoom.jpg");
?>
第一行代碼是強(qiáng)制下載;
第二行代碼是給下載的內(nèi)容指定一個(gè)名字;
第三行代碼是把下載的內(nèi)容讀進(jìn)文件中。
如何在PHP下載文件名中解決亂碼
通過把Content-Type設(shè)置為application/octet-stream,可以把動(dòng)態(tài)生成的內(nèi)容當(dāng)作文件來下載,相信這個(gè)大家都會(huì)。那么用Content-Disposition設(shè)置下載的文件名,這個(gè)也有不少人知道吧?;旧?,下載程序都是這么寫的:
復(fù)制代碼 代碼如下:
<?php
$filename = "document.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>
這樣用瀏覽器打開之后,就可以下載document.txt。
但是,如果$filename是UTF-8編碼的,有些瀏覽器就無法正常處理了。比如把上面那個(gè)程序稍稍改一下:
復(fù)制代碼 代碼如下:
<?php
$filename = "中文 文件名.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>
把程序保存成UTF-8編碼再訪問,IE6下載的文件名就會(huì)亂碼。 FF3下下載的文件名就只有“中文”兩個(gè)字。Opera 9下一切正常。
輸出的header實(shí)際上是這樣子:
Content-Disposition: attachment; filename=中文 文件名.txt其實(shí)按照RFC2231的定義,多語言編碼的Content-Disposition應(yīng)該這么定義:
復(fù)制代碼 代碼如下:
Content-Disposition: attachment; filename*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"
即:
filename后面的等號(hào)之前要加 *
filename的值用單引號(hào)分成三段,分別是字符集(utf8)、語言(空)和urlencode過的文件名。
最好加上雙引號(hào),否則文件名中空格后面的部分在Firefox中顯示不出來
注意urlencode的結(jié)果與php的urlencode函數(shù)結(jié)果不太相同,php的urlencode會(huì)把空格替換成+,而這里需要替換成%20
經(jīng)過試驗(yàn),發(fā)現(xiàn)幾種主流瀏覽器的支持情況如下:
IE6 attachment; filename="<URL編碼之后的UTF-8文件名>"
FF3 attachment; filename="UTF-8文件名"
attachment; filename*="utf8''<URL編碼之后的UTF-8文件名>"
O9 attachment; filename="UTF-8文件名"
Safari3(Win) 貌似不支持?上述方法都不行
這樣看來,程序必須得這樣寫才能支持所有主流瀏覽器:
復(fù)制代碼 代碼如下:
<?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';
?>
您可能感興趣的文章:
- 在Nginx中使用X-Sendfile頭提升PHP文件下載的性能(針對(duì)大文件下載)
- 解決PHP超大文件下載,斷點(diǎn)續(xù)傳下載的方法詳解
- php 下載保存文件保存到本地的兩種實(shí)現(xiàn)方法
- Php中文件下載功能實(shí)現(xiàn)超詳細(xì)流程分析
- php利用header函數(shù)實(shí)現(xiàn)文件下載時(shí)直接提示保存
- PHP實(shí)現(xiàn)遠(yuǎn)程下載文件到本地
- PHP文件下載類
- php使瀏覽器直接下載pdf文件的方法
- php實(shí)現(xiàn)的支持?jǐn)帱c(diǎn)續(xù)傳的文件下載類
- php中強(qiáng)制下載文件的代碼(解決了IE下中文文件名亂碼問題)
- php readfile下載大文件失敗的解決方法
相關(guān)文章
Typecho插件實(shí)現(xiàn)添加文章目錄的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何實(shí)現(xiàn)為Typecho插件實(shí)現(xiàn)添加文章目錄的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-02-02淺談PHP接入(第三方登錄)QQ登錄 OAuth2.0 過程中遇到的坑
下面小編就為大家?guī)硪黄獪\談PHP接入(第三方登錄)QQ登錄 OAuth2.0 過程中遇到的坑。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10PHP實(shí)現(xiàn)的簡(jiǎn)單異常處理類示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的簡(jiǎn)單異常處理類,結(jié)合具體實(shí)例形式分析了php基于面向?qū)ο蠹夹g(shù)實(shí)現(xiàn)異常處理操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-05-05php讓json_encode不自動(dòng)轉(zhuǎn)義斜杠“/”的方法
在本篇文章里小編給大家分享的是關(guān)于php讓json_encode不自動(dòng)轉(zhuǎn)義斜杠“/”的方法,需要的朋友們可以學(xué)習(xí)下。2020-04-04php 微信開發(fā)獲取用戶信息如何實(shí)現(xiàn)
這篇文章主要介紹了php 微信開發(fā)獲取用戶信息如何實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2016-12-12