zoukankan      html  css  js  c++  java
  • 呵呵哒,LNMP下通过fread方式下载文件时,中文名称文件找不到文件

    哎,整整折腾一个下午。 

    本来好好的,thinkphp 自动的uniq方式保存的文件名,非要使用原文件名,真心蛋疼~~

    然后就只好写个脚本 把原来的所有文件都重新命名一下 - - 然后把数据库对应字段也改为对应的中文文件名。

    因为对自己的脚本太自信,也就没有备份数据库。然后杯具发生了 - - 是的,它真滴发生了。。。。

    在本地测试(wamp)的fread方式下载文件好好的,结果上传到服务器(LNMP)就杯具鸟,下载的时候提示找不到文件,查看路径文件真真切切的就在那里,不远不近,怎么搞都不好使 - -

    折腾啊折腾,各种输出变量调试,经过近2个小时的折腾。发现了一点问题,那就是在本地测试的时候把中文文件名传参数过去之后,服务器端获取的也是中文,然后就顺利的读到了文件。

    然而上传到LNMP之后,传的中文文件名被URL转码了(相当于自动urlencode),惯性的以为转码后服务端也可以认识,然而并不是这样的。。。。

    file_exists 介个函数不认识转码的东西,它只认识一样的东西。因此问题就出在这里。 最后通过接收的URL中文部分进行反转码(urldecode),然后再执行file_exists这个函数就搞定了。。。 哎 我的半个下午就毁在这里了,内牛满面哇 - -0

    下面上一段下载的代码吧

    public function download_file(){
            $file = urldecode($this->_get('file'));
            $base_path = $_SERVER['DOCUMENT_ROOT'].'/Uploads/Attachement/';
            $file = iconv('UTF-8','gb2312',$file);
            $file = $base_path. $file;
            var_dump($file);
            // exit();
            if(file_exists($file)){
                $length = filesize($file);
                // $type = mime_content_type($file);
    /*            $fi = new finfo(FILEINFO_MIME);
                $type = $fi->buffer(file_get_contents($file));*/
                $showname =  ltrim(strrchr($file,'/'),'/');
                header("Content-Description: File Transfer");
                // header('Content-type: ' . $type);
                header('Content-Length:' . $length);
                header('content-type:text/html; charset=utf-8');
                
                 if (preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) { //for IE
                     header('Content-Disposition: attachment; filename="' . rawurlencode($showname) . '"');
                 } else {
                     header('Content-Disposition: attachment; filename="' . $showname . '"');
                 }
                 ob_clean();
                 flush();
                 readfile($file);
                 exit;
             } else {
                 exit('文件已被删除!');
             }
         }

    客户端很简单咯:

    <div><a href="__APP__/Index/download_file/file/<{$post.attachment}>">下载{$post.attachment}</a></div>

    顺便吐个槽,最近两天比较郁闷, 我们的老板,对,他是连office word都用不明白的银,然后在他眼里,软件开发完成后就不能有BUG,使用不方便的情况也算BUG奥。然后做的越多,那被的锅就越多,然后各种被嫌弃,还让我自己找问题,美其名曰主动是天堂。好叭,被你打败了,没啥好留恋的了,春节后,下一站再见!

    ——————后记

    哈哈,不得不说上面客户端的代码还是有点问题,如果附件是图片等格式的话,那上面的代码会导致部分内容无法下载。经过测试,修改为以下形式即可下载成功。

    <div><a href="__APP__/Index/download_file?file=<{$post.attachment}>">下载{$post.attachment}</a></div>
  • 相关阅读:
    Go语言new( )函数
    Go语言讲解深拷贝与浅拷贝
    (转)使用kubectl访问Kubernetes集群时的身份验证和授权
    执行kubectl命令时报错 error: You must be logged in to the server (Unauthorized)
    报错 cannot allocate memory 或者 no space left on device ,修复K8S内存泄露问题
    linux之apt-get命令(转)
    GSensor 碰撞检测方法与实现
    uboot流程(转)
    linux 环境搭建
    333开发记录
  • 原文地址:https://www.cnblogs.com/aleafo/p/5055084.html
Copyright © 2011-2022 走看看