封装一个文件上传类完成基本功能如下:

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封装一个通用好用的文件上传处理类的更多相关文章

  1. spring boot 文件上传工具类(bug 已修改)

    以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...

  2. spring mvc 文件上传工具类

    虽然文件上传在框架中,已经不是什么困难的事情了,但自己还是开发了一个文件上传工具类,是基于springmvc文件上传的. 工具类只需要传入需要的两个参数,就可以上传到任何想要上传的路径: 参数1:Ht ...

  3. 文件上传工具类 UploadUtil.java

    package com.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...

  4. FastDFS 文件上传工具类

    FastDFS文件上传工具类 import org.csource.common.NameValuePair; import org.csource.fastdfs.ClientGlobal; imp ...

  5. Angular4 后台管理系统搭建(10) - 做一个通用的可跨域上传文件的组件

    写的很慢,不知不觉这是第十篇了.但是我其他事情太多,只能抽空写下.现在angular4或angular2流行的上传方式是ng2-file-upload.它的功能很强大.但是我没有配置成可以跨域上传的. ...

  6. Java一个文件上传工具类

    /** * 文件上传 * * @author cary * @since 2012-12-19 下午2:22:12 */ public class FileUploader { static fina ...

  7. Java 使用 commons-fileupload 实现文件上传工具类

    依赖包 文件上传可以使用 Apache 文件上传组件, commons-fileupload, 它依赖于 commons-io commons-io.jar: https://repo1.maven. ...

  8. PHP设计超级好用的文件上传处理类一 (37)

    <?php class FileUpload { private $filepath; //指定上传文件保存的路径 private $allowtype=array('gif', 'jpg', ...

  9. HTML5文件上传器,纯脚本无插件的客户端文件上传器---Uploader 文件上传器类

    概述 客户端完全基于JavaScript的 浏览器文件上传器,不需要任何浏览器插件,但需要和jQuery框架协同工作,支持超大文件上传,其算法是将一个超大文件切片成N个数据块依次提交给服务 端处理,由 ...

随机推荐

  1. 动态添加和更改F7编辑器(div和editGrid列)

    //更改列编辑器 waf("#editGrid").wafGrid("setColumnConfig", "settlementType", ...

  2. Sql Server日期查询-SQL查询今天、昨天、7天内、30天

    今天的所有数据: 昨天的所有数据: 7天内的所有数据: 30天内的所有数据: 本月的所有数据: 本年的所有数据: 查询今天是今年的第几天: select datepart(dayofyear,getD ...

  3. oracle建表并设置ID为自动增长

    CREATE TABLESPACE shopping DATAFILE 'D:\oracle\mypc\oradata\orcl\shopping.dbf' SIZE 20M AUTOEXTEND O ...

  4. Linux下shell脚本中信号捕获和函数练习脚本之ping一个网段

    该脚本主要的目的是练习在Linux bash脚本中捕获信号,顺便练习一下函数的使用,还有就是终止一个正在运行的程序后,该程序打开的文件的后续处理问题等等!脚本功能:  ping一个网段内的IP,检测哪 ...

  5. map转json

    if (javaObject instanceof Map) { Map<Object, Object> map = (Map<Object, Object>) javaObj ...

  6. [转]图片中的字符分割提取(基于opencv)

    http://blog.csdn.net/anqing715/article/details/16883863 源图片 像这些图片的字符就比较好操作,每个字符都独立,不连在一起,所以轮廓检测最好了.所 ...

  7. sql 编写横竖表转换

    将横表转为竖表,基本思想是: 1)将横表的多条数据,"压"成一条.相当于将这么多条分组,每组"压"成一条数据.利用group by 2) 再对竖表中的列,由特定 ...

  8. Maven中的dependencyManagement 意义

    1.在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器. 2.pom.xml文件中,jar的版本判断的两种途径 1:如果dependenci ...

  9. css008 给网页添加图片

    css008 给网页添加图片 1.            css和<img>标签       1.<img>标签是html的添加图片的标签,一般为: <img src=” ...

  10. matlab解三元二次方程组

    C1=7.0863; C2=6.8971; C3=0.4929; C4=0.8131; C5=1.8240; C6=3.8108; C7=3.7318; C8=-2.2238; C9=1.9905; ...