PHP文件上传处理
web中,文件上传是一个很常用的功能。如:上传头像、上传图片。这些提交到后台的图片都要交给后端处理。php提供了几个上传处理的函数,我把它们封装成类,以便日后使用。
处理流程(可能有不合理的地方,用时再做简单的修改):
1. 检查是否是合法的上传文件;
2. 检查是否上传成功;
3. 检查文件大小;
4. 验证文件后缀;
5. 移动文件长久保存;
以下是类的具体代码:
<?php
//处理上传的文件
class uploadFile{
public $filename; //上传时设置表单中的文件名
public $fileInfo; //上传的文件的信息
public $maxSize=50000; //允许的最大文件大小(字节)
public $fileSuffex='txt|zip||';//允许的文件后缀,例如:*(任意) 或者 txt|zip|| 格式,表示后缀名可以是txt、zip或者没有
public $fileDir='/home/WWW/tmp/';//设置指定目录
public $newFileName; //设置新文件名字
private $filePath;//最终文件的路径与文件名,$fileDir.$newFileName
public function __construct($filename=null,$newFile='ulfile'){
$this->filename=$filename;
$this->newFileName=$newFile;
$this->fileInfo=&$_FILES[$filename];
$this->filePath=$this->fileDir.$newFile;
}
/**
* 处理整个上传流程,成功则返回1,失败返回相应的错误代码
* @return int
*/
public function handle(){
if($this->filename){
if(!$this->isUpload()) return 2;//非上传文件
if(!$this->successed()) return 3;//上传失败
if(!$this->checkSuffex()) return 4;//指定后缀无效
if(!$this->checkSize()) return 5;//上传文件太大
if(!$this->moveFile()) return 6;//移动文件失败
return 1;//文件上传并处理成功
}else return 0;//未设置上传时指定的文件名
}
/**
* 检查是否是上传文件
* @return boolean
*/
private function isUpload(){
if(is_uploaded_file($this->fileInfo['tmp_name'])) return true;
else return false;
}
/**
* 检查是否上传成功,成功返回true,失败返回false
* @return boolean
*/
public function successed(){
if($this->filename){
$state=$this->fileInfo['error'];
if($state==0) return true;
else return false;
}
}
/**
* 判断文件后缀是否在指定列表中
* @return boolean
*/
private function checkSuffex(){
if($this->fileSuffex=='*') return true;
// $tempNames=explode('.',$this->fileInfo['name']);//不能直接使用函数的返回创建引用
// $currentSuffex=end($tempNames);//end()需要传入引用
// var_dump($currentSuffex);
$currentSuffex= pathinfo($this->fileInfo['name'],PATHINFO_EXTENSION);
$suffexArray= explode('|', $this->fileSuffex);
if(in_array($currentSuffex, $suffexArray)){
return true;
}else return false;
}
/**
* 检查上传的文件的大小是否指定限制
* @return boolean
*/
private function checkSize(){
if($this->fileInfo['name']<=$this->maxSize) return true;
else return false;
}
/**
* 移动文件到指定目录,返回boolean
* @return boolean
*/
private function moveFile(){
if(move_uploaded_file($this->fileInfo['tmp_name'], $this->filePath)) return true;
else return false;
}
}
接下来测试一下,新建一个html文件:
<!DOCTYPE html>
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h1>上传文件</h1>
<form method="POST" action="acceptFile.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000"/>
请选择文件:<input type="file" name="ulFile"/>
<button>上传</button>
</form>
</body>
</html>
提交到acceptFile.php(与uploadFile.php在同一文件夹):
<?php
//导入上传文件处理类
define('THISDIR',dirname(__FILE__).'/');
require_once(THISDIR.'uploadFile.php');
$ulFile=new uploadFile('ulFile','newFile');
$state=$ulFile->handle();
if($state==1){
echo '文件上传并处理成功!';
}else{
echo '文件上传或处理时出错,错误代码:'.$state;
}
var_dump($ulFile->fileInfo);
注意:脚本开头定义了一个常量’THISDIR’,从名字就可以看出它的内容是当前的文件夹路径,这是为了使用绝对路径来require处理类,以免出现路径问题而引用失败。(关于这个内容参见:PHP中require和include路径问题详解)
然后开启web服务器,访问upload.html,选择文件并上传:
这个文件并没有后缀,所以后缀就为空。
结果:
试着传个带扩展名的:
结果:
可以看到,有错误代码返回,所以失败了。大家可以查看类里面的错误代码看到对应的错误是后缀验证失败。因为我们设置的后缀里没有conf。而第一次上传的文件中的后缀为空,在我们设置的后缀中是包含没有后缀的文件的!当然,设置为 * 就不限制后缀了。
最后一个问题,虽然上传失败了,但是文件还是传到服务器的临时文件夹了,因为系统判断的上传并没有问题。所以,要定期清理一下服务器的临时文件夹,有的系统可能会定时清空临时目录。最好的方法是写个脚本定时清理,或者再写个删除上传失败的临时文件的方法。
PHP文件上传处理的更多相关文章
- jquery.uploadify文件上传组件
1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...
- 11、Struts2 的文件上传和下载
文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...
- Java FtpClient 实现文件上传服务
一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...
- 小兔Java教程 - 三分钟学会Java文件上传
今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...
- ,net core mvc 文件上传
工作用到文件上传的功能,在这个分享下 ~~ Controller: public class PictureController : Controller { private IHostingEnvi ...
- Web开发安全之文件上传安全
很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...
- AutoIt实现Webdriver自动化测试文件上传
在运用WebDriver进行自动化测试时,由于WebDriver自身的限制,对于上传文件时Windows弹出的文件选择窗口无法控制,通过在网上查找资料锁定使用AutoIt来控制文件上传窗口. Auto ...
- Struts的文件上传下载
Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...
- .JavaWeb文件上传和FileUpload组件使用
.JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(32)-swfupload多文件上传[附源码]
系列目录 文件上传这东西说到底有时候很痛,原来的asp.net服务器控件提供了很简单的上传,但是有回传,还没有进度条提示.这次我们演示利用swfupload多文件上传,项目上文件上传是比不可少的,大家 ...
随机推荐
- eclipse手动安装svn和maven
一.给Eclipse安装SVN,最常见的有两种方式:手动方式和使用安装向导方式.具体步骤如下: 方式一:手动安装 1.从官网下载site-1.6.9.zip文件,网址是:subclipse.tigri ...
- scrapy+Lucene搭建小型搜索引擎
Reference: http://blog.csdn.net/napoay/article/details/51477586 一.选题 工程类搜索型: 定向采集 3-4 个新闻网站, 实现这些网站信 ...
- C语言-switch语句
switch (表达式的值) { case 1: 语句1 break; case 2: 语句2 break; case 3: 语句3 break; case 4: 语句4 break; ...... ...
- C语言-知识点及学习路线
最近进行了为期两周的C语言培训,把几年前学过的C语言又重新学习了一遍,然后根据学习的内容和过程,总结了一下学习路线.这是基本的C语言学习路线,相当于编程语言类的基础,再根据自己究竟是要做单片机开发,还 ...
- Windows 10安裝在USB外接硬碟(使用命令模式)
微軟公司已經在2015年7月29日發佈Windows 10正式版,這個版本在使用介面上就像是Windows 7加上Windows 8的組合, 開始鍵與功能列回來了.微軟提供Windows 7與Wind ...
- 利用Navicat实现MySQL数据库结构对比和同步
在生产环境中,我们总会因为这样或那样的原因导致主从不同步,亦或者是测试环境要和生产环境进行同步,利用Navicat结构同步工具,不但能找出库结构差异,还可以针对create.modify.drop等进 ...
- Stanford机器学习课程之一——引言
Andrew Ng的Machine Learning课程,在网易公开课上有中文版视频http://v.163.com/special/opencourse/machinelearning.html,六 ...
- Servlet 应用程序事件、监听器
Web容器管理Servlet/JSP相关的生命周期,若对HttpServletRequest对象.HttpSession对象.ServletContxt对象在生成.销毁或相关属性设置发生的时机点有兴趣 ...
- CentOS6.5+mysql5.1源码安装过程
一:先安装依赖包(不然配置的时候会报错的!) yum -y install ncurses* libtermcap* gcc-c++* 新建mysql用户 [root@HE1Packages]# gr ...
- Spring EL中的类操作符
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://ww ...