关于PHP文件下载中文文件

那项目拖了这么久了……今天写最后的“下载专区”。其中就不可避免的涉及到中文文件下载的问题。

我现在是在Windows下开发,文件路径是GBK的编码,而我的php文件用的是utf-8,所以会造成无法找到文件。但是如果每次都用mb_convert_encoding转换成gbk的格式,可能会在Linux的服务器上有出现问题。所以应该考虑比较兼容的方式。


网上搜了一下,普遍是用的下面的代码

<?php
    $file = "/tmp/中文名.tar.gz";
 
    $filename = basename($file);
 
    header("Content-type: application/octet-stream");
 
    //处理中文文件名
    $ua = $_SERVER["HTTP_USER_AGENT"];
    $encoded_filename = rawurlencode($filename);
    if (preg_match("/MSIE/", $ua)) {
     header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
    } else if (preg_match("/Firefox/", $ua)) {
     header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
    } else {
     header('Content-Disposition: attachment; filename="' . $filename . '"');
    }
 
    header("Content-Length: ". filesize($file));
    readfile($file);

当然,测试并没有效果。

然后我就用算是取巧的办法。

            $filename = '哈哈.doc';
            $filePath = './Upload/file/'.$filename;
            // 中文可能会出现问题
            if(!file_exists($filePath)){
                $filePath = mb_convert_encoding($filePath, "gbk", "utf-8");
                $filename = mb_convert_encoding($filename, "gbk", "utf-8");
                if(!file_exists($filePath)){
                    $this->error('没有找到文件,请稍后再试……');
                }
            }

            header("Content-type: application/octet-stream");
            header('Content-Disposition: attachment; filename="'.$filename.'"');
            header("Content-Length: ". filesize($filePath));
            readfile($filePath);


先判断现在的utf-8编码是否可行,如果不行,把文件路径的字符串转换成gbk格式,在判断文件是否存在。

如果都不存在,则认为文件就是不存在。


不知道我这想法有没有错误呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值