为了账号安全,请及时绑定邮箱和手机立即绑定

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

554731700001f4e903570195.jpghttp://img1.sycdn.imooc.com//5547318900011dd304670142.jpg

背景介绍:

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

正在回答

4 回答

你可以判断下要下载的文件名第一个字符是否为中文,如果是中文的话需要通过iconv转码,接着在指定下载文件名那加个判断,是中文就不要使用basename了,如果第一个字符不是中文这个写法就ok

^-^...

1 回复 有任何疑惑可以回复我~

谢谢大家了,我找到了更好的解决办法,存的时候,存为英文的,同时把中文名(带后缀的)也存入表中,下载时候,直接用中文的来表示,发现下载后的文件名就为中文的。

1 回复 有任何疑惑可以回复我~
#1

UFO2015

不错哟!
2015-10-24 回复 有任何疑惑可以回复我~

第3行, 不要用 basename ;直接用 $filename

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信