关于TP3.2在LNMP环境中文档上传和上传文档下载

来源:互联网 发布:淘宝卖视频 违规 编辑:程序博客网 时间:2024/05/22 00:14

这两天特别受挫,忍住了拍桌子骂人,主要是担心影响到别人。因为我是有素质的好员工。
下面给大家聊一聊在LNMP环境下使用TP3.2上传文档,必要时下载文档。当然保留在服务器端的文件不想改变文件名,保留其中文名等乱七八糟的名字。


列一列用到的知识点:

  1. TP3.2的上传类;
  2. urlencode()和urldecode()的使用;
  3. 绝对路径和相对路径;
  4. file_exists()的坑;

说实话TP3.2的上传类很好用。上代码!!!!!!!!

 public function uploads(){        $upload = new \Think\Upload();// 实例化上传类        $filename = $_FILES['files']['name'];        $map = 0-(strlen($filename)-(strripos($filename,'.')));        $v = urlencode(substr($filename,0,$map));        $upload->maxSize   =     3145728 ;// 设置附件上传大小        $upload->saveName = iconv("UTF-8","gb2312", $v);        $upload->replace = true;        $upload->exts      =     '';        $upload->rootPath  =     './Uploads/'; // 设置附件上传根目录        // 上传文件              $info   =   $upload->upload();            if(!$info) {// 上传错误提示错误信息                $this->error($upload->getError());            }else{// 上传成功 可以将上传的信息保留在数据库中,操作根据自己的情况写,                 $Id = $_GET['id'];                 $date = date('Y-m-d',strtotime('now'));                 $person = M('表名')->where("Id ='".$Id."'")->select();                 if($person[0]['File'] != null){                    $data['File'] = $person[0]['File'].urlencode($date."/".$filename).",";                 }else{                    $data['File'] = urlencode($date."/".$filename).",";                 }                 $result = M('表名')->where(" Id = '".$Id."'")->save($data);                 if($result){                    echo 1;                 }else{                    echo 0;                 }            }    }

大家能看懂么?我感觉我写的够详细了。这里我的入口文件是在和Public文件夹同级,而不是在其下面。所以我的Uploads文件夹也是在Public和入口文件同级。使用urlencode()将文件名进行百分号编码保存。这样的好处一可以加密,二可以少踩坑。所以我保存到数据库是这样的“2017-09-28%2F%E7%8E%8B%E6%98%A5%E7%87%95.pdf,2017-09-28%2F%E4%B8%AD%E6%96%87.docx,”字符串。


接下来写下载上传的文档。。。。。。。$_GET[‘name’] =’2017-09-28/中文名.docx’格式,这里是因为我遍历的时候把文件进行解码用到了urldecode()。

public function get_file(){        $files = explode('/', $_GET['name']);        $getFile = urlencode($files[1]);        # 将浏览器传入的UTF-8编码的文件名,转换成Windows服务器认的GB2312编码,然后才能下载相关文件        $file_path = './Uploads/'.$files[0].'/'.$getFile;        $file_path = mb_convert_encoding($file_path,'GB2312');        if(file_exists($file_path)) {            $saveName = urldecode(end(explode('/', $file_path)));             # 将Windows服务器认的GB2312编码,转换成浏览器认的UTF-8编码            // $saveName = iconv('GB2312', 'UTF-8', $saveName);             header("Content-Type: application/octet-stream");            header("Accept-Ranges: bytes");            # 计算文件大小,使用Windows服务器认的GB2312编码            header("Accept-Length: ".filesize($file_path));            # 在浏览器端保存文件,使用浏览器认的UTF-8编码            header("Content-Disposition: attachment; filename=\"{$saveName}\"");            # 读取文件,使用Windows服务器认的GB2312编码            readfile($file_path);        } else {            echo $file_path;        }    }

之前我以为使用绝对路径会很好做,实际呢?出了太多的错,被我臭骂一顿,舍弃了!
这里另一个坑就是file_exists()。这玩意不认识转码的东西,它只认识一样的东西。你们知道路径的编码必须是‘GB2312’才能找到文件么?我之前是不知道的,所以看着文件在那我就是取不到!你可能知道另一个函数iconv( )可以进行编码设置,但是它真的不好用,以后再也不用它转码了,建议用mb_convert_encoding(),第一个参数是你想要转码的字符串,第二个参数是想要的编码类型。


最后送你们删除文件。继续看代码:$file =2017-09-28%2F%E7%8E%8B%E6%98%A5%E7%87%95.pdf 是这样的格式呦。

$filename = $filename = str_replace("%2f","/",$file);$dir = './Uploads/'.$filename;$dir = mb_convert_encoding($dir,'GB2312');$re = unlink ($dir);

这里只要路径写对,编码正确就可以轻轻松删除文件。
啦啦啦,结束了!希望可以帮到你们!同样感谢以下的文章提供的支持!
关于编码问题

原创粉丝点击