PHP.12-PHP-设计文件上传类
设计文件上传类
**********************
*#构造方法编写
**********************
此种传参方法规定必须用户必须按响应位置输入,并不能只输出其中某一个或几个参数的值 【使用中不方便,不推荐使用】
让用户不用按位置传参数,可任意输出其中某一个或几个参数,其余使用默认值 【按数组传递】
#利用数组传参
****************************************
*上传文件的方法【限制大小、限制类型、是否随机文件名,报错信息】
****************************************
多个方法用到同一变量,设置为全局变量
设置错误号
获得成员属性
上传文件
拷贝文件到指定目录
先做随机生成文件名
调用设置新文件名函数
判断是否成功,拷贝文件方法
多文件上传【保持调用方法不变】
主要代码
FileLoad.class
<?php
class FileUpload {
private $filepath; //指定上传文件保存的路径,一般不用默认
private $allowtype=array('gif','jpg','png','jpeg');//允许上传文件类型
private $maxsize=1000000; //允许上传的最大长度1M
private $israndname=true; //是否随机重命名,false不随机 private $originName; //源文件名
private $tmpFileName; //临时文件名
private $fileType; //文件类型
private $fileSize; //文件大小
private $newFileName; //新文件名
private $errorNum=0; //错误号
private $errorMess=""; //用来提供错误报告 //用于对上传文件初始化
//1.指定上传文件路径,2、允许的类型,3、限制大小,4、是否使用随机文件名称
//让用户可以不用按位置传参数,后面参数给值不用将前几个提供值,使用默认值
function __construct($options=array()) {//构造方法,创建对象
foreach($options as $key=>$val){
//查看用户参数中数组的下标值是否和成员属性名相同;get_class_vars()得到类的属性;get_class获得类名
if(!in_array($key,get_class_vars(get_class($this)))){
continue;
} $this->setOption($key,$val);//传输参数
} } private function setOption($key,$val){ //定义私有方法,设置值
$this->$key=$val;
} /************************都需要获得成员属性*************************************/
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 .="文件过大,上传文件不能超过{$this->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,0755)){
$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(strtolower($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("YmdHis")."_".rand(100,999);
return $fileName.'.'.$this->fileType;
}
/**************************************************************/ function uploadFile($fileField){//用于上传文件的方法
$return=true;
//检查文件上传路径是否正确
if(!$this->checkFilePath()){
$this->errorMess=$this->getError();
return false;
} $name=$_FILES[$fileField]['name'];
$tmp_name=$_FILES[$fileField]['tmp_name'];
$size=$_FILES[$fileField]['size'];
$error=$_FILES[$fileField]['error'];
/*********************************多个文件上传*******************************************************/ if(is_Array($name)){ //判断文件名是不是数组(即多上传)
$error=array(); for($i=0;$i<count($name); $i++){
if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
if(!$this->checkFileSize() || !$this->checkFileType()){
$errors[]=$this->getError();
$return=false;
} }else{
$error[]=$this->getError();
$return=false;
} if(!$return) //如果此次有错误,下一次循环必须初始化
$this->setFiles(); } if($return){
for($i=0;$i<count($name);$i++){
if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
$this->setNewFileName();
if(!$this->copyFile()){
$errors=$this->getError();
$return=false;
}else {
$fileNames[]=$this->newFileName;
}
} }
$this->newFileName=$fileNames; }
//打包错误消息到数组
$this->errorMess=$errors;
return $return; }else {
/***************************************单个文件上传********************************************/
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){
$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){
//调用setOption方法,接收参数
$this->setOption('errorNum',$error); if($error){ //若有错误,则无需继续往下执行
return false;
} $this->setOption('originName',$name);
$this->setOption('tmpFileName',$tmp_name);
$arrStr=explode('.',$name); //以点分割文件名输入数组
$this->setOption('fileType',strtolower($arrStr[count($arrStr)-1]));//取最后一个数组的值(后缀名);strolower:转换为小写
$this->setOption('fileSize',$size); return true;
} function getNewFileName(){//用于获取上传后的文件名
return $this->newFileName;
} function getErrorMsg(){//上传失败后,显示错误报告
return $this->errorMess;
} }
?>
upload
<?php
require "FileUpload.class.php"; //包含此类 $up=new FileUpload(array('israndname'=>true,'allowtype'=>array('jpg','doc','php','gif'),'filepath'=>'./uploads/','maxsize'=>2000000));//上传文件类实例化,按位置传递 echo '<pre>'; //输出圆形 if($up->uploadFile('spic')){
print_r($up->getNewFileName()); //print_r以数组形式打印
}else{
print_r($up->getErrorMsg());
} echo '</pre>'
// var_dump($up);//打印对象up,输出返回内容
?>
PHP.12-PHP-设计文件上传类的更多相关文章
- PHP图片上传类
前言 在php开发中,必不可少要用到文件上传,整理封装了一个图片上传的类也很有必要. 图片上传的流程图 一.控制器调用 public function upload_file() { if (IS_P ...
- php 文件上传类 实例分享
最近在研究php上传的内容,找到一个不错的php上传类,分享下. <?php /** * 文件上传类 * class: uploadFile * edit: www.jbxue.com */ c ...
- php 文件上传类,功能相当齐全,留作开发中备用吧。
收藏一个经典好用的php 文件上传类,功能相当齐全,留作开发中备用吧. 好东西,大家都喜欢,才是真的好,哈哈!!! <?php /** * 文件上传类 */ class upload ...
- PHP多图片上传类推荐
多文件上传是PHP中的一个基础应用,反正PHPer都会遇到的问题,现在就介绍一个功能完善.强大的多文件上传类给大家吧,能用上这个类的地方会很多. <?php class Upload{ var ...
- THINKPHP源码学习--------文件上传类
TP图片上传类的理解 在做自己项目上传图片的时候一直都有用到TP的上传图片类,所以要进入源码探索一下. 文件目录:./THinkPHP/Library/Think/Upload.class.php n ...
- Ueditor 1.4.3.1 使用 ThinkPHP 3.2.3 的上传类进行图片上传
在 ThinkPHP 3.2.3 中集成百度编辑器最新版 Ueditor 1.4.3.1,同时将编辑器自带的上传类替换成 ThinkPHP 3.2.3 中的上传类. ① 下载编辑器(下载地址:http ...
- webpy分页类 + 上传类
webpy没有分页类.按照php的思路.自己编了一个.数据库用的是sqlite. class Page(object): '''分页类''' def __init__(self,page_size,d ...
- ASP.NET 文件上传类 简单好用
调用: UploadFile uf = new UploadFile(); /*可选参数*/ uf.SetIsUseOldFileName(true);//是否使用原始文件名作为新文件的文件名(默认: ...
- PHP多文件上传类
<?php class Upload{ var $saveName;// 保存名 var $savePath;// 保存路径 var $fileFormat = array('gif','jpg ...
随机推荐
- virtualenv 和 virtualenvwrapper 实践
virtualenv 首先来聊一下 virtualenv 是个什么鬼. 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题:亦或者是在开发过程中不想让物理环境里充 ...
- 转】用Maven构建Hadoop项目
原博文出自于: http://blog.fens.me/hadoop-maven-eclipse/ 感谢! 用Maven构建Hadoop项目 Hadoop家族系列文章,主要介绍Hadoop家族产品 ...
- Axis2与Web项目整合
一.说明: 上一篇介绍了通过使用Axis2来发布和调用WebService,但是是把WebService发布在Axis2提供的项目中,如果我们需要在自己的Web项目中来使用Axis2发布WebServ ...
- Spring REST实践之Error Handling
Error Responses 在REST API中,HTTP状态码有非常重要的作用.API开发者应该坚持为每一个请求返回一个正确合适的状态码,而且应该在响应body中包含有用的.细粒度的错误信息.这 ...
- CentOS7 安装 MySQL 5.7.10
卸载冲突的rpm包:rpm -qa|grep mariadbrpm -e --nodeps mariadb-libs-5.5.41-2.el7_0.x86_64 安装:rmp -ivh mysql-c ...
- Makefile基础
1.规则 规则定义格式如下 目标 : 条件1 条件2 ... 命令1 命令2 ... 隐含规则和模式规则(略) 2.变量 Makefile变量像C的宏定义一样,代表一串字符,在取值的地方展开. 1)两 ...
- 启动tomcat时 一闪而过解决方法
1 首先确定JAVA 已经配好了环境变量,具体配置方法,找一下度娘. 测试方法:进入cmd -> javac -version 能看到JAVA的版本信息,证明配置成功了. 2 分析一下问题出现的 ...
- sql reiserror 输出错误
其语法如下: RAISERROR ( { msg_id | msg_str | @local_variable } { ,severity ,state } ...
- JAVA核心技术--继承
1.继承:向上追溯,对同一批类的抽象,延续和扩展父类的一切信息! 1)关键字:extends 例如,父类是Animal,子类是Dog; eg: public class Dog exte ...
- tab栏切换的特殊效果(类似网易的登陆栏效果)
代码显示效果如上图所示: 需求说明: 在实际需求中,会遇到这样的情况:不仅是要展示选项卡的内容,而且还有可能在选项卡中需求顾客填写相关内容,而这些内容是顾客如果想了解更深层次的,就会继续填写右边的内容 ...