参考出处:
http://www.imooc.com/qadetail/76393
Nginx环境下,PHP下载,中文文件,下载失效(英文可以下载)怎么解决呢?
背景介绍:
文件名 为英文时可以下载,文件名 为中文时报404错误,而实际上服务器端 文件是存在的。
网上找一下,据说是 URL发送时编码问题。有两种解决方案:
①打开浏览器,去掉默认的以utf8发送(测试过没问题,但因为要在客户端操作,所有没采纳)
②写一个下载处理函数。
$id:记录的id
$table:表名
$urlField:表中存储 路径+文件名.后缀 的字段
1 function download($id,$table='tender_uploadfile',$urlField='upload_url'){ 2 global $db,$pre; 3 $file = $db->get_one("SELECT A.* FROM `{$pre}{$table}` A WHERE A.id = '$id'"); 4 $fileType = strtolower(strrchr($file[$urlField], '.')); 5 if(!$file || !file_exists(ROOT_PATH . $file[$urlField])){ 6 showerr("I'm so sorry! File not found!",1); 7 } else { 8 //点击量 9 ($table == 'tender_uploadfile') && @$db->query("UPDATE `{$pre}{$table}` SET hits = hits + 1 WHERE id = '$id'"); 10 11 $fp = fopen(ROOT_PATH . $file[$urlField],"r"); 12 13 header("Pragma: public"); 14 header("Expires: 0"); 15 header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 16 header("Cache-Control: public"); 17 header("Content-Description: File Transfer"); 18 19 Header("Content-type: " . getFileMimeMapping($fileType)); 20 Header("Accept-Ranges: bytes"); 21 header('Content-Transfer-Encoding: binary'); 22 Header("Accept-Length: ".filesize(ROOT_PATH . $file[$urlField])); 23 //若出现乱码iconv("utf-8","gbk",$file[upload_title])) 24 $fileName = $file[upload_title] ? $file[upload_title] : $file[title]; 25 Header("Content-Disposition: attachment; filename=" . $fileName); 26 27 28 echo fread($fp, filesize(ROOT_PATH . $file[$urlField])); 29 /*此方式使用大文件,起缓存 30 $content = ""; 31 while (!feof($fp)) { 32 $content .= fread($fp, 1024); 33 $stream_meta_data = stream_get_meta_data($fp); //Added line 34 if($stream_meta_data['unread_bytes'] <= 0) break; //Added line 35 36 } 37 */ 38 fclose($fp); 39 //echo $content; 40 } 41 exit; 42 } |
问题:
在IE、360上,下载时丢失文件后缀,或下载下来的为.php的文件,实际上传的为doc、rar、docx、zip中的任意一种。这该怎么解决?