PHP封装一个通用好用的文件上传处理类
封装一个文件上传类完成基本功能如下:
1.可上传多个或单个文件
2.上传成功返回一个或多个文件名
3.上传失败则返回每个失败文件的错误信息
上传类中的基本功能:
1.构造参数,用户可以自定义配置参数,不限大小写,不限个数,不限顺序
2.检测:保存路径、文件类型、文件大小、文件名是否为随机文件名等
3.错误消息:如果在判断过程中出现错误,则生成错误号并返回错误消息
上传类如下:

Code<?php
/**
* 通用文件上传类
*/
class FileUpload
{
private $filepath; //指定上传文件保存的路径
private $allowtype=array('gif','jpg','png','jpeg');//默认允许上传文件的类型
private $maxsize=5000; //默认允许上传文件的最大长度
private $israndname=true; //是否使用随机文件名,false则使用原文件名 private $originName; //原文件名
private $tmpFileName; //临时文件名
private $fileType; //文件类型
private $fileSize; //文件大小
private $newFileName; //新文件名
private $errorNum=0; //错误号
private $errorMsg=''; //错误消息 //初始化文件上传
//1.指定上传路径 2.限制类型 3.限制大小 4.是否使用随机文件名
//使用可变数组来实现构造函数的重载【重载】
//优点:
//用户可以自定义参数的个数和顺序
//用户在输入关联键值错误的情况下仍然可以使用默认参数,不影响代码执行
//不区分键名的大小写
function __construct($options=array()){
//如果使用$this->filepath=$filepath的常规构造函数初始化:参数个数顺序用户无法自定义,用户输入错误时代码无法执行
//根据类的对象获取类的属性的数组:get_class_vars(get_class($this)); //判断用户给定的数组中的key是存在于类的属性中,如果存在,则给属性重新赋值
foreach ($options as $key => $val) {
$key = strtolower($key);//将用户给定的key转为小写 比较
if (!array_key_exists($key, get_class_vars(get_class($this)))) {
continue;
}
$this->SetOptions($key,$val);
}
} //上传文件
public function UploadFile($fileField){
//检查用户设置的上传文件的保存路径
if(!$this->CheckFilePath()){
$this->errorMsg=$this->SetErrorMsg();
return false;
} //取得上传文件的信息
$name = $_FILES[$fileField]['name'];
$tmp_name = $_FILES[$fileField]['tmp_name'];
$size = $_FILES[$fileField]['size'];
$error = $_FILES[$fileField]['error']; //判断 是否为多文件上传
//一个文件上传出错,则全部失败,全部正确则全部上传
$result=true;//申明变量$result用于判断上传过程中是否有错 //如果是多文件上传
if(is_array($name)){ //定义错误信息数组,存储出错信息
$errors = array(); //循环读取文件信息并保存文件
for ($i=0; $i < count($name); $i++) {
//循环遍历文件信息,判断类型和大小
if ($this->SetFileInfo($name[$i],$tmp_name[$i],$size[$i],$error[$i])) {
//检查文件大小和类型
if(!$this->CheckFileType()||!$this->CheckFileSize()){
//将出错信息储存到数组$errors中
$errors[]=$this->SetErrorMsg();
$result = false;
}
} else {
$errors[]=$this->SetErrorMsg();
$result = false;
} //将文件属性初始化,以免出错的文件信息被保留
if(!$result){
$this->SetFileInfo();
}
} //如果检查上传的所有文件都没有问题了,则保存所有文件
if ($result) { //定义一个数组变量$fileNames,用于存储上传成功后的图片文件名
$fileNames = array(); //循环文件信息,保存文件
for ($i=0; $i < count($name); $i++) {
if ($this->SetFileInfo($name[$i],$tmp_name[$i],$size[$i],$error[$i])) {
$this->SetFileName();
if (!$this->CopyFile()) {
$errors=$this->SetErrorMsg();
$result=false;
} else {
$fileNames[]=$this->newFileName;
}
}
} //将新文件名数组赋值给类的属性newFileName
$this->newFileName=$fileNames;
} $this->errorMsg = $errors;
return $result; }else{//如果是单个文件上传
if($this->SetFileInfo($name,$tmp_name,$size,$error)){
//检查文件大小和类型
if($this->CheckFileType()&&$this->CheckFileSize()){
//获取文件名
$this->SetFileName();
//保存文件
if($this->CopyFile())
{
return true;
}else{
$result=false;
}
}
else{
$result=false;
}
}else{
$result=false;
}
if(!$result){
$this->errorMsg= SetErrorMsg();
}
return $result; }
} //获取文件名
public function GetNewFileName(){
return $this->newFileName;
} //获取错误信息
public function GetError(){
return $this->errorMsg;
} //初始化文件信息
private function SetFileInfo($name='',$tmp_name='',$size=0,$error=0)
{
$this->SetOptions('errorNum',$error);
if($error){
return false;
}
$this->SetOptions('originName',$name);
$this->SetOptions('tmpFileName',$tmp_name);
$this->SetOptions('fileSize',$size); $arrStr = explode('.', $name);
$this->SetOptions('fileType',strtolower($arrStr[count($arrStr)-1])); return true;
} //获取上传后的文件名
private function SetFileName()
{
if($this->israndname){
$fileName =@date('YmdHis').rand(100,999);
$fileName = $fileName.'.'.$this->fileType;
$this->SetOptions("newFileName",$fileName);
}else{
$this->SetOptions('newFileName',$this->originName);
}
} //上传失败时,获取失败消息
private function SetErrorMsg()
{
$msg='上传文件<font color="red">'.$this->originName.'</font>时出错:';
switch ($this->errorNum) {
case 4:$msg.="没有文件被上传";break;
case 3:$msg.="文件只有部分被上传";break;
case 2:$msg.="文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";break;
case 1:$msg.="文件超过了 php.ini 中 upload_max_filesize 选项限制的值";break;
case -1:$msg.="未允许的文件类型";break;
case -2:$msg.="文件过大,上传文件不能超过{$this->maxSize}个字节";break;
case -3:$msg.="上传失败";break;
case -4:$msg.="建立存放文件目录失败,请重新指定上传目录";break;
case -5:$msg.="必须指定上传文件的路径";break;
default:$msg.="未知错误";
}
return $msg.'<br>';
} //设置属性
private function SetOptions($key,$val){
$this->$key=$val;
} //检查文件的保存路径
private function CheckFilePath(){
//如果用户没有指定文件的保存路径
if(empty($this->filepath)){
$this->SetOptions('errorNum',-5);
return false;
} //如果用户设置的文件目录不存在或不可写
if(!file_exists($this->filepath)||!is_writable($this->filepath)){
//尝试创建目录,如果不成功,则设置错误信息
if(!@mkdir($this->filepath,0755)){
$this->SetOptions('errorNum',-4);
return false;
}
} return true;
} //检查上传的文件类型
private function CheckFileType(){
if(in_array(strtolower($this->fileType),$this->allowtype)){
return true;
}else{
$this->SetOptions("errorNum",-1);
return false;
}
} //检查上传的文件大小
private function CheckFileSize(){
if($this->fileSize>$this->maxsize){
$this->SetOptions('errorNum',-2);
return false;
}else{
return true;
}
} //保存文件 移动成功返回true,否则返回false
private function CopyFile(){
if (!$this->errorNum) {
$newPath=rtrim($this->filepath,'/').'/';
$newPath.=$this->newFileName; if(@move_uploaded_file($this->tmpFileName, $newPath)){
return true;
}else{
$this->SetOptions('errorNum',-3);
return false;
}
} else {
return false;
}
} }
?>
HTML 上传页面

PHP接收文件处理页面

上传失败:

上传成功:

注:本文参考于兄弟边PHP教程制作
PHP封装一个通用好用的文件上传处理类的更多相关文章
- spring boot 文件上传工具类(bug 已修改)
以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...
- spring mvc 文件上传工具类
虽然文件上传在框架中,已经不是什么困难的事情了,但自己还是开发了一个文件上传工具类,是基于springmvc文件上传的. 工具类只需要传入需要的两个参数,就可以上传到任何想要上传的路径: 参数1:Ht ...
- 文件上传工具类 UploadUtil.java
package com.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...
- FastDFS 文件上传工具类
FastDFS文件上传工具类 import org.csource.common.NameValuePair; import org.csource.fastdfs.ClientGlobal; imp ...
- Angular4 后台管理系统搭建(10) - 做一个通用的可跨域上传文件的组件
写的很慢,不知不觉这是第十篇了.但是我其他事情太多,只能抽空写下.现在angular4或angular2流行的上传方式是ng2-file-upload.它的功能很强大.但是我没有配置成可以跨域上传的. ...
- Java一个文件上传工具类
/** * 文件上传 * * @author cary * @since 2012-12-19 下午2:22:12 */ public class FileUploader { static fina ...
- Java 使用 commons-fileupload 实现文件上传工具类
依赖包 文件上传可以使用 Apache 文件上传组件, commons-fileupload, 它依赖于 commons-io commons-io.jar: https://repo1.maven. ...
- PHP设计超级好用的文件上传处理类一 (37)
<?php class FileUpload { private $filepath; //指定上传文件保存的路径 private $allowtype=array('gif', 'jpg', ...
- HTML5文件上传器,纯脚本无插件的客户端文件上传器---Uploader 文件上传器类
概述 客户端完全基于JavaScript的 浏览器文件上传器,不需要任何浏览器插件,但需要和jQuery框架协同工作,支持超大文件上传,其算法是将一个超大文件切片成N个数据块依次提交给服务 端处理,由 ...
随机推荐
- waf2控件名
1,查询表格(queryGrid),编辑表格(editGrid) wafGrid 2,快速F7 wafPromptQuick 3,表格F7 wafPromptGrid 4,自定义F7 wafPromp ...
- python——代码编码格式转换
最近刚换工作不久,没太多的时间去整理工作中的东西,大部分时间都在用来熟悉新公司的业务,熟悉他们的代码框架了,最主要的是还有很多新东西要学,我之前主要是做php后台开发的,来这边之后还要把我半路出家的前 ...
- jpa注解
http://www.oracle.com/technetwork/cn/middleware/ias/toplink-jpa-annotations-100895-zhs.html#ManyToOn ...
- TypeScript 素描 - 泛型、枚举
/* 泛型,好处多多的功能.不过这里最基本的就不打算说了,仅准备说一些 和C#不同的地方 */ /* 泛型接口 GenericIdentityFn 定义了方法的描述等 identity方法则是它的实现 ...
- How to overcome “datetime.datetime not JSON serializable” in python?
json.dumps(datetime.now) 意思是datetime.now不可json序列化,解决办法是转化成str或者加一个参数 cls=xxx 详细见: http://stackoverfl ...
- jQuery ajax - serialize() 方法-输出序列化表单值
定义和用法 serialize() 方法通过序列化表单值,创建 URL 编码文本字符串. 您可以选择一个或多个表单元素(比如 input 及/或 文本框),或者 form 元素本身. 序列化的值可在生 ...
- 【Alpha阶段】第六次Scrum例会
会议信息 时间:2016.10.27 21:30 时长:30min 地点:大运村1号公寓5楼楼道 类型:日常Scrum会议 个人任务报告 姓名 今日已完成Issue 明日计划Issue 工作困难 今日 ...
- JavaScript中捕获/阻止捕获、冒泡/阻止冒泡
JavaScript中捕获/阻止捕获.冒泡/阻止冒泡 事件流描述的是从页面中接收事件的顺序.提出事件流概念的正是IE和Netscape,但是前者提出的是我们常用的事件冒泡流,而后者提出的是事件捕获流. ...
- css属性设置
css在线编辑工具地址:http://tool.chinaz.com/Tools/CssDesigner.aspx 案例详情: http://dongtianee.sinaapp.com/index. ...
- 【原】requirejs学习笔记
随着JS越来越庞大,已经不仅仅是以前复制粘贴做特效的时代了,JS越来越偏向于业务逻辑与应用.JS在web开发中占有越来越重要的地位. 由于JS代码庞大,文件数目多,传统的使用<script sr ...