关于TP3.2在LNMP环境中文档上传和上传文档下载
来源:互联网 发布:淘宝卖视频 违规 编辑:程序博客网 时间:2024/05/22 00:14
这两天特别受挫,忍住了拍桌子骂人,主要是担心影响到别人。因为我是有素质的好员工。
下面给大家聊一聊在LNMP环境下使用TP3.2上传文档,必要时下载文档。当然保留在服务器端的文件不想改变文件名,保留其中文名等乱七八糟的名字。
列一列用到的知识点:
- TP3.2的上传类;
- urlencode()和urldecode()的使用;
- 绝对路径和相对路径;
- 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);
这里只要路径写对,编码正确就可以轻轻松删除文件。
啦啦啦,结束了!希望可以帮到你们!同样感谢以下的文章提供的支持!
关于编码问题
- 关于TP3.2在LNMP环境中文档上传和上传文档下载
- sharepoint 2016 学习系列篇(21)-文档库应用篇-(3)在文档库中上传文档和下载文档
- abap 上传\下载文档
- tp3.2 实现 PHPExcel 上传 下载
- 关于tp3.2的非法文件上传
- struts2 文档上传及下载
- Oss使用文档 ##[上传,下载]
- 上传文档
- Lnmp环境搭建和部署xapi文档
- App通过使用iTunes让用户上传和下载文档
- TP3.2.3使用CKeditor编辑器在页面中上传图片
- WDA中上传EXCEL文档
- PHP TP3.2 音乐文件上传并在本地播放
- 用java在web环境下上传和下载文件
- ACTION中直接上传图片或者文档
- sharepoint list 文档上传和删除
- jsp文档上传案例
- C#上传文档
- Reactjs+Redux 简介
- 开源中国在线正则表达式匹配测试
- Linux 内核锁机制之进程抢占&中断
- ListView深入浅出
- 网络编程复习(五):Socket编程中的IO模式详解
- 关于TP3.2在LNMP环境中文档上传和上传文档下载
- 【课件】八皇后问题
- 微信小程序数据缓存
- 高级C语言教程-关键字和运算符
- thread.interrupt
- 每天一个linux命令(4):mkdir命令
- javascript 点击删除按钮后弹出对话框
- 洛谷Oj-过河-动态规划+离散化
- Block 的理解和使用