Nginx環(huán)境下,PHP下載,中文文件,下載失效(英文可以下載)怎么解決呢?
背景介紹:
文件名 ?為英文時可以下載,文件名 為中文時報404錯誤,而實際上服務器端 ?文件是存在的。
網上找一下,據(jù)說是 ?URL發(fā)送時編碼問題。有兩種解決方案:
①打開瀏覽器,去掉默認的以utf8發(fā)送(測試過沒問題,但因為要在客戶端操作,所有沒采納)
②寫一個下載處理函數(shù)。
$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])); ????????//若出現(xiàn)亂碼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
謝謝大家了,我找到了更好的解決辦法,存的時候,存為英文的,同時把中文名(帶后綴的)也存入表中,下載時候,直接用中文的來表示,發(fā)現(xiàn)下載后的文件名就為中文的。
2015-05-04
第3行, 不要用 basename ;直接用 $filename