web中,文件上传是一个很常用的功能。如:上传头像、上传图片。这些提交到后台的图片都要交给后端处理。php提供了几个上传处理的函数,我把它们封装成类,以便日后使用。
处理流程(可能有不合理的地方,用时再做简单的修改):
1. 检查是否是合法的上传文件;
2. 检查是否上传成功;
3. 检查文件大小;
4. 验证文件后缀;
5. 移动文件长久保存;
以下是类的具体代码:

  1. <?php
  2. //处理上传的文件
  3. class uploadFile{
  4. public $filename; //上传时设置表单中的文件名
  5. public $fileInfo; //上传的文件的信息
  6. public $maxSize=50000; //允许的最大文件大小(字节)
  7. public $fileSuffex='txt|zip||';//允许的文件后缀,例如:*(任意) 或者 txt|zip|| 格式,表示后缀名可以是txt、zip或者没有
  8. public $fileDir='/home/WWW/tmp/';//设置指定目录
  9. public $newFileName; //设置新文件名字
  10. private $filePath;//最终文件的路径与文件名,$fileDir.$newFileName
  11. public function __construct($filename=null,$newFile='ulfile'){
  12. $this->filename=$filename;
  13. $this->newFileName=$newFile;
  14. $this->fileInfo=&$_FILES[$filename];
  15. $this->filePath=$this->fileDir.$newFile;
  16. }
  17. /**
  18. * 处理整个上传流程,成功则返回1,失败返回相应的错误代码
  19. * @return int
  20. */
  21. public function handle(){
  22. if($this->filename){
  23. if(!$this->isUpload()) return 2;//非上传文件
  24. if(!$this->successed()) return 3;//上传失败
  25. if(!$this->checkSuffex()) return 4;//指定后缀无效
  26. if(!$this->checkSize()) return 5;//上传文件太大
  27. if(!$this->moveFile()) return 6;//移动文件失败
  28. return 1;//文件上传并处理成功
  29. }else return 0;//未设置上传时指定的文件名
  30. }
  31. /**
  32. * 检查是否是上传文件
  33. * @return boolean
  34. */
  35. private function isUpload(){
  36. if(is_uploaded_file($this->fileInfo['tmp_name'])) return true;
  37. else return false;
  38. }
  39. /**
  40. * 检查是否上传成功,成功返回true,失败返回false
  41. * @return boolean
  42. */
  43. public function successed(){
  44. if($this->filename){
  45. $state=$this->fileInfo['error'];
  46. if($state==0) return true;
  47. else return false;
  48. }
  49. }
  50. /**
  51. * 判断文件后缀是否在指定列表中
  52. * @return boolean
  53. */
  54. private function checkSuffex(){
  55. if($this->fileSuffex=='*') return true;
  56. // $tempNames=explode('.',$this->fileInfo['name']);//不能直接使用函数的返回创建引用
  57. // $currentSuffex=end($tempNames);//end()需要传入引用
  58. // var_dump($currentSuffex);
  59. $currentSuffex= pathinfo($this->fileInfo['name'],PATHINFO_EXTENSION);
  60. $suffexArray= explode('|', $this->fileSuffex);
  61. if(in_array($currentSuffex, $suffexArray)){
  62. return true;
  63. }else return false;
  64. }
  65. /**
  66. * 检查上传的文件的大小是否指定限制
  67. * @return boolean
  68. */
  69. private function checkSize(){
  70. if($this->fileInfo['name']<=$this->maxSize) return true;
  71. else return false;
  72. }
  73. /**
  74. * 移动文件到指定目录,返回boolean
  75. * @return boolean
  76. */
  77. private function moveFile(){
  78. if(move_uploaded_file($this->fileInfo['tmp_name'], $this->filePath)) return true;
  79. else return false;
  80. }
  81. }

接下来测试一下,新建一个html文件:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>TODO supply a title</title>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. </head>
  8. <body>
  9. <h1>上传文件</h1>
  10. <form method="POST" action="acceptFile.php" enctype="multipart/form-data">
  11. <input type="hidden" name="MAX_FILE_SIZE" value="1000000"/>
  12. 请选择文件:<input type="file" name="ulFile"/>
  13. <button>上传</button>
  14. </form>
  15. </body>
  16. </html>

提交到acceptFile.php(与uploadFile.php在同一文件夹):

  1. <?php
  2. //导入上传文件处理类
  3. define('THISDIR',dirname(__FILE__).'/');
  4. require_once(THISDIR.'uploadFile.php');
  5. $ulFile=new uploadFile('ulFile','newFile');
  6. $state=$ulFile->handle();
  7. if($state==1){
  8. echo '文件上传并处理成功!';
  9. }else{
  10. echo '文件上传或处理时出错,错误代码:'.$state;
  11. }
  12. var_dump($ulFile->fileInfo);

注意:脚本开头定义了一个常量’THISDIR’,从名字就可以看出它的内容是当前的文件夹路径,这是为了使用绝对路径来require处理类,以免出现路径问题而引用失败。(关于这个内容参见:PHP中require和include路径问题详解

然后开启web服务器,访问upload.html,选择文件并上传:

这个文件并没有后缀,所以后缀就为空。

结果:

试着传个带扩展名的:

结果:

可以看到,有错误代码返回,所以失败了。大家可以查看类里面的错误代码看到对应的错误是后缀验证失败。因为我们设置的后缀里没有conf。而第一次上传的文件中的后缀为空,在我们设置的后缀中是包含没有后缀的文件的!当然,设置为 * 就不限制后缀了。

最后一个问题,虽然上传失败了,但是文件还是传到服务器的临时文件夹了,因为系统判断的上传并没有问题。所以,要定期清理一下服务器的临时文件夹,有的系统可能会定时清空临时目录。最好的方法是写个脚本定时清理,或者再写个删除上传失败的临时文件的方法。

PHP文件上传处理的更多相关文章

  1. jquery.uploadify文件上传组件

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  2. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  3. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  4. 小兔Java教程 - 三分钟学会Java文件上传

    今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...

  5. ,net core mvc 文件上传

    工作用到文件上传的功能,在这个分享下 ~~ Controller: public class PictureController : Controller { private IHostingEnvi ...

  6. Web开发安全之文件上传安全

    很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...

  7. AutoIt实现Webdriver自动化测试文件上传

    在运用WebDriver进行自动化测试时,由于WebDriver自身的限制,对于上传文件时Windows弹出的文件选择窗口无法控制,通过在网上查找资料锁定使用AutoIt来控制文件上传窗口. Auto ...

  8. Struts的文件上传下载

    Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...

  9. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

  10. ASP.NET MVC5+EF6+EasyUI 后台管理系统(32)-swfupload多文件上传[附源码]

    系列目录 文件上传这东西说到底有时候很痛,原来的asp.net服务器控件提供了很简单的上传,但是有回传,还没有进度条提示.这次我们演示利用swfupload多文件上传,项目上文件上传是比不可少的,大家 ...

随机推荐

  1. HUST 1600 Lucky Numbers

    暴力打表. #include<cstdio> #include<cstring> #include<cmath> #include<string> #i ...

  2. 组织Golang代码

    本月初golang官方blog(需要自己搭梯子)上发布了一篇文章,简要介绍了近几个月Go在一 些技术会议上(比如Google I/O.Gopher SummerFest等)的主题分享并伴有slide链 ...

  3. ucos任务优先级从64到256,任务就绪表的改变

    Ucos在任务调度中经常使用的技术为任务就绪表,在之前的文章中使用的例子是低于64个优先级的任务就绪表查找方法,现在ucos将任务扩展到256优先级之后,任务就绪表的查找也做了一定的修改,今天来讲讲 ...

  4. 微信小程序登录

    一. 小程序不支持cookie会话 1. 通过传递与检验3rd_session来保持会话 2. 3rd_session可以执行'`head -n 80 /dev/urandom | tr -dc A- ...

  5. PHP的高并发和大数据处理

    收集前人的经验.加速学习,解决工作中的难题. 一.代码优化(包括sql语句的优化), 合理的使用索引,避免整表查询.二.日常海量数据处理我用文件缓存,文件缓存分两种,第一种是最常见的生成html静太文 ...

  6. [noip2013]货车运输(kruskal + 树上倍增)

    描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多 ...

  7. 今天学习了下,如何破解wifi

    破解了隔壁的wif,得罪了,哥哥要蹭网一段时间. 主要思路:安装linux环境.这里我选择了虚拟机加cdlinux .运行里面的min抓得握手包,然后淘宝花10元跑下包,因为自己的电脑不行,跑费时间太 ...

  8. sql语句:if exists语句使用

    ') begin print('exists ') end else begin print('no exists ') end go

  9. github上一些酷炫效果

    转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包括ListView.ActionBar.M ...

  10. linux下安装mysql(编译mysql源码)

    编译所需软件地址 http://mysql.mirror.kangaroot.net/Downloads/  -- 下载需要的mysql版本例如mysql-5.5.39.tar.gz    目前还不太 ...