PHP设计的超强大的文件上传类(单文件上传)
form.html
<!DOCTYPE html> <html> <head> <title>文件上传</title> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="1000000"> <input type="file" name="spic"><br> <input type="submit" name="sub" value="上传文件"> </form> </body> </html>
upload.php
<?php include "./FileUpload.class.php"; $up=new FileUpload(array('isRandName'=>true,'allowType'=>array('txt','doc','pig','gif','php','jpg'),'filePath'=>'./upload/','maxSize'=>2000000)); if($up->uploadFile('spic')){ echo $up->getNewFileName(); }else{ echo $up->getErrorMsg(); } //var_dump($up); ?>
FileUpload.class.php
<?php class FileUpload{ //上传文件保存的路径 private $filePath; //允许上传文件的类型 private $allowType=array('gif','jpg','png','jpeg'); //上传文件的最大尺寸 1M private $maxSize=1000000; //是否是随机文件名 private $isRandName=true; //原文件名称 private $originName; //临时文件名称 private $tmpFileName; //文件类型 private $fileType; //文件的大小 private $fileSize; //新文件名 private $newFileName; //错误号 private $errorNum; //用来提供错误报告 private $errorMess; //用于对上传文件的初始化 //1.指定上传的路径。2.允许的类型。3.限制大小。4.是否使用随机文件名 //让用户可以不用按位置传参数,后面参数給值不用将前几个参数也提供值 function __construct($options=array()){ /*$this->filePath=$filePath; $this->allowType=$allowType; $this->maxSize=$maxSize; $isRandName=$isRandName;*/ foreach ($options as $key => $value) { //将传过来的$key全转变成小写 //$key=strtolower($key); //查看用户参数中数组的下标是否和成员属性名相同 if(!in_array($key,get_class_vars(get_class($this)))){ continue; } $this->setOption($key,$value); } /*print_r(get_class_vars(get_class($this)));*/ } private function setOption($key,$value){ $this->$key=$value; } private function getError(){ $str="上传文件<font color='red'>{$this->originName}</font>时出错!"; switch($this->errorNum){ case 4:$str.="没有文件被上传!";break; case 3:$str.="文件只被部分上传!";break; case 2:$str.="上传文件超过了HTML表单中MAX_FILE_SIZE选项指定的值!";break; case 1:$str.="上传文件超过了php.ini中的upload_max_filesize选项的值!";break; case -1:$str.="未允许的类型";break; case -2:$str.="文件过大,上传文件不能超过{$thi->maxSize}个字节";break; case -3:$str.="上传失败";break; case -4:$str.="创建存放上传文件目录失败,请重新指定上传目录";break; case -5:$str.="必须指定上传文件的路径";break; default:$str.="未知错误"; } return $str."<br>"; } //用来检查文件上传路径 private function checkFilePath(){ if(empty($this->filePath)){ $this->setOption('errorNum',-5); return false; } if(!file_exists($this->filePath)||!is_writable($this->filePath)){ if(!@mkdir($this->filePath)){ $this->setOption('errorNum',-4); return false; } } return true; } //用于检查文件上传的大小 private function checkFileSize(){ if($this->fileSize>$this->maxSize){ $this->setOption('errorNum',-2); return false; }else{ return true; } } //用于检查文件上传类型 private function checkFileType(){ if(in_array($this->fileType,$this->allowType)){ return true; }else{ $this->setOption('errorNum',-1); return false; } } //设置上传后的文件名称 private function setNewFileName(){ if($this->isRandName){ $this->setOption('newFileName',$this->proRandName()); }else{ $this->setOption('newFileName',$this->originName); } } //是否设置随机文件名 private function proRandName(){ $fileName=date("Y").date("m").date("d").date("H").date("i").date("s").rand(100,999)."."; //随机文件名 return $fileName.".".$this->fileType; } //用来上传一个文件 function uploadFile($fileFied){ $return=true; //检查文件上传路径 if(!$this->checkFilePath()){ $this->errorMess=$this->getError(); return false; } $name=$_FILES[$fileFied]['name']; $tmp_name=$_FILES[$fileFied]['tmp_name']; $size=$_FILES[$fileFied]['size']; $error=$_FILES[$fileFied]['error']; if($this->setFiles($name,$tmp_name,$size,$error)){ //检查文件的尺寸和类型 if($this->checkFileSize()&&$this->checkFileType()){ $this->setNewFileName(); if($this->copyFile()){ return true; }else{ $return=false; } }else{ $return=false; } }else{ $return=false; } if(!$return){ $this->errorMess=$this->getError(); } return $return; } //把上传的文件从临时文件中拷贝出来 private function copyFile(){ if($this->errorNum==0){ //无论上传的路径是否有“/”都加上“/” $filePath=rtrim($this->filePath,'/').'/'; $filePath.=$this->newFileName; if(@move_uploaded_file($this->tmpFileName, $filePath)){ return true; }else{ $this->setOption('errorNum',-3); return false; } }else{ return false; } } //设置和$_FILES有关的内容 private function setFiles($name="",$tmp_name="",$size=0,$error=0){ $this->setOption('errorNum',$error); if($error){ return false; } $this->setOption('originName',$name); $this->setOption('tmpFileName',$tmp_name); //分割 $arrStr=explode('.', $name); $this->setOption('fileType',$arrStr[count($arrStr)-1]); $this->setOption('fileSize',$size); return true; } //用于获取上传后文件的文件名 function getNewFileName(){ return $this->newFileName; } //上传如果失败,则调用这个方法,就可以查看错误报告 function getErrorMsg(){ return $this->errorMess; } } ?>
PHP设计的超强大的文件上传类(单文件上传)的更多相关文章
- Spring MVC-------文件上传,单文件,多文件,文件下载
Spring MVC 框架的文件上传是基于 commons-fileupload 组件的文件上传,只不过 Spring MVC 框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现,取消了 ...
- SpringMVC文件上传下载(单文件、多文件)
前言 大家好,我是bigsai,今天我们学习Springmvc的文件上传下载. 文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一.你可能经常在网页上传下载文件,你可能 ...
- php文件上传之单文件上传
为了简单一些,php文件跟form表单写在了一个文件里. php单文件上传----> <!DOCTYPE html> <html> <head> <me ...
- SpringBoot - 实现文件上传1(单文件上传、常用上传参数配置)
Spring Boot 对文件上传做了简化,基本做到了零配置,我们只需要在项目中添加 spring-boot-starter-web 依赖即可. 一.单文件上传 1,代码编写 (1)首先在 stati ...
- java文件上传(单文件 多文件)与删除
/** * 文件上传--单文件 * * @param request * @param response * @param path * 文件存放路径(path为WebApp\后面的内容) * @re ...
- Struts1文件上传、单文件、多文件上传【Struts1】
将struts1文件上传的操作汇总了一下,包括单文件上传和多文件上传,内容如下,留作备忘: Struts2实现文件上传的文章(http://blog.csdn.net/itwit/article/d ...
- C#文件上传类,文件流,字节数组等
using System;using System.IO;using System.Web;using System.Web.UI.WebControls; namespace DotNet.Util ...
- flask 文件上传(单文件上传、多文件上传)
文件上传 在HTML中,渲染一个文件上传字段只需要将<input>标签的type属性设为file,即<input type=”file”>. 这会在浏览器中渲染成一个文件上传字 ...
- springMVC上传功能(单文件和多文件上传)
单文件和多文件上传 首先在xxx-select.xml里面配置上传的大小和编码 <bean id="multipartResolver" class="org.sp ...
随机推荐
- PIL中的Image和numpy中的数组array相互转换
1. PIL image转换成array img = np.asarray(image) 需要注意的是,如果出现read-only错误,并不是转换的错误,一般是你读取的图片的时候,默认选择的是&quo ...
- 【基本技能篇】>>第2篇《如何把事情做到最好——心得》
如何把事情做到最好——全美第一本系统阐述学习与成功之道的经典著作. ——2016年2月12日 四个阅读层次:①基础阅读,具有基本阅读的能力,包括认识字,懂得词,知会句子的基本意思等.②检视阅读(也是判 ...
- Windows Store App 网络通信 HttpClient
HttpClient类包含在System.Net.Http命名空间中,是向以URI标识的网络资源发送HTTP请求和接收HTTP响应的基类.在HTTP请求中使用该类可以向Web服务发送GET.POST等 ...
- winform flash
1.开发工具:VS2013 2.开发环境:win 10 64位 3.添加控件: 打开VS,点击工具箱--常规--右键--“选择项”---“Com组件”--MacroMedia Flash Factor ...
- [CentOS] 指定命令别名:Alias & 软链接生成命令 ln -s
参考:CentOS里alias命令详解 每天一个linux命令(35):ln 命令 1. Alias命令 功能描述:我们在进行系统的管理工作一定会有一些我们经常固定使用,但又很长的命令.那我们可以给这 ...
- oracle 存储过程小总结
1 创造存储过程 Create or procedure My_procedure( param1,param2) is Begin . . . End 2 判断语句 If x>0 then B ...
- java集合中的传值和传引用
在学习java集合过程中发现了传值和传引用的区别: 我们来看下面两句话 ●java集合就像一种容器,我们可以把多个对象(实际上是对象的引用),丢进该容器.(来自疯狂java讲义) ●当使用Iterat ...
- Visual Studio 2015 新建MVC项目 Package Manager Console不能使用 (HRESULT: 0x80131500)
Visual studio 2015 突然新建不了MVC项目,报出错误: HRESULT: 0x80131500 在折腾了很长时间,最后在Github上看到这样一个贴 地址:https://githu ...
- 破解Google Gmail的https新思路
最近,Google针对gmail被攻击事件,全面默认启用了始终以https访问Gmail的方式了.但是,对于可以动用整个国家力量的黑客来说,从网络通讯数据中(在此不讨论对用户电脑种木马破解https的 ...
- pom 详解
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...