Nginx環境下,PHP下載,中文文件,下載失效(英文可以下載)怎么解決呢?


背景介紹:
文件名 ?為英文時可以下載,文件名 為中文時報404錯誤,而實際上服務器端 ?文件是存在的。
網上找一下,據說是 ?URL發送時編碼問題。有兩種解決方案:
①打開瀏覽器,去掉默認的以utf8發送(測試過沒問題,但因為要在客戶端操作,所有沒采納)
②寫一個下載處理函數。
$id:記錄的id
$table:表名
$urlField:表中存儲 路徑+文件名.后綴 的字段
function?download($id,$table='tender_uploadfile',$urlField='upload_url'){
????global?$db,$pre;
????$file?=?$db->get_one("SELECT?A.*?FROM?`{$pre}{$table}`?A?WHERE?A.id?=?'$id'");
????$fileType?=?strtolower(strrchr($file[$urlField],?'.'));
????if(!$file?||?!file_exists(ROOT_PATH?.?$file[$urlField])){
????????showerr("I'm?so?sorry!?File?not?found!",1);
????}?else?{
????????//點擊量
????????($table?==?'tender_uploadfile')?&&?@$db->query("UPDATE?`{$pre}{$table}`?SET?hits?=?hits?+?1??WHERE?id?=?'$id'");
????????$fp?=?fopen(ROOT_PATH?.?$file[$urlField],"r");
header("Pragma:?public");?
header("Expires:?0");?
header("Cache-Control:?must-revalidate,?post-check=0,?pre-check=0");?
header("Cache-Control:?public");??
header("Content-Description:?File?Transfer");?
????????Header("Content-type:?"?.?getFileMimeMapping($fileType));
????????Header("Accept-Ranges:?bytes");
header('Content-Transfer-Encoding:?binary');?
????????Header("Accept-Length:?".filesize(ROOT_PATH?.?$file[$urlField]));
????????//若出現亂碼iconv("utf-8","gbk",$file[upload_title]))
????????$fileName?=?$file[upload_title]???$file[upload_title]?:?$file[title];
????????Header("Content-Disposition:?attachment;?filename="?.?$fileName);
????????echo?fread($fp,?filesize(ROOT_PATH?.?$file[$urlField]));
????????/*此方式使用大文件,起緩存
????????$content?=?"";
????????while?(!feof($fp))?{
????????????$content?.=?fread($fp,?1024);
????????????$stream_meta_data?=?stream_get_meta_data($fp);?//Added?line
????????????if($stream_meta_data['unread_bytes']?<=?0)?break;?//Added?line
????????}
????????*/
????????fclose($fp);
????????//echo?$content;
????}
????exit;
}問題:
在IE、360上,下載時丟失文件后綴,或下載下來的為.php的文件,實際上傳的為doc、rar、docx、zip中的任意一種。這該怎么解決?
2015-05-11
你可以判斷下要下載的文件名第一個字符是否為中文,如果是中文的話需要通過iconv轉碼,接著在指定下載文件名那加個判斷,是中文就不要使用basename了,如果第一個字符不是中文這個寫法就ok
^-^...
2015-06-02
謝謝大家了,我找到了更好的解決辦法,存的時候,存為英文的,同時把中文名(帶后綴的)也存入表中,下載時候,直接用中文的來表示,發現下載后的文件名就為中文的。
2015-05-04
第3行, 不要用 basename ;直接用 $filename