xgqfrms™, xgqfrms® : xgqfrms's offical website of cnblogs! xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

Nginx环境下,PHP下载,中文文件,下载失效(英文可以下载)怎么解决呢?

参考出处:

http://www.imooc.com/qadetail/76393

Nginx环境下,PHP下载,中文文件,下载失效(英文可以下载)怎么解决呢?

554731700001f4e903570195.jpghttp://img.mukewang.com/5547318900011dd304670142.jpg

背景介绍:

文件名  为英文时可以下载,文件名 为中文时报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中的任意一种。这该怎么解决?

 

posted @   xgqfrms  阅读(467)  评论(2编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示