设计文件上传类

PHP参数详解】{文件上传

**********************

*#构造方法编写

**********************

此种传参方法规定必须用户必须按响应位置输入,并不能只输出其中某一个或几个参数的值  【使用中不方便,不推荐使用】

让用户不用按位置传参数,可任意输出其中某一个或几个参数,其余使用默认值  【按数组传递】

#利用数组传参

****************************************

*上传文件的方法【限制大小、限制类型、是否随机文件名,报错信息】

****************************************

多个方法用到同一变量,设置为全局变量

$_FILES函数详解

设置错误号

获得成员属性

上传文件

 拷贝文件到指定目录

先做随机生成文件名

调用设置新文件名函数

判断是否成功,拷贝文件方法

多文件上传【保持调用方法不变】

主要代码

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-设计文件上传类的更多相关文章

  1. PHP图片上传类

    前言 在php开发中,必不可少要用到文件上传,整理封装了一个图片上传的类也很有必要. 图片上传的流程图 一.控制器调用 public function upload_file() { if (IS_P ...

  2. php 文件上传类 实例分享

    最近在研究php上传的内容,找到一个不错的php上传类,分享下. <?php /** * 文件上传类 * class: uploadFile * edit: www.jbxue.com */ c ...

  3. php 文件上传类,功能相当齐全,留作开发中备用吧。

    收藏一个经典好用的php 文件上传类,功能相当齐全,留作开发中备用吧. 好东西,大家都喜欢,才是真的好,哈哈!!! <?php  /**   * 文件上传类   */  class upload ...

  4. PHP多图片上传类推荐

    多文件上传是PHP中的一个基础应用,反正PHPer都会遇到的问题,现在就介绍一个功能完善.强大的多文件上传类给大家吧,能用上这个类的地方会很多. <?php class Upload{ var ...

  5. THINKPHP源码学习--------文件上传类

    TP图片上传类的理解 在做自己项目上传图片的时候一直都有用到TP的上传图片类,所以要进入源码探索一下. 文件目录:./THinkPHP/Library/Think/Upload.class.php n ...

  6. Ueditor 1.4.3.1 使用 ThinkPHP 3.2.3 的上传类进行图片上传

    在 ThinkPHP 3.2.3 中集成百度编辑器最新版 Ueditor 1.4.3.1,同时将编辑器自带的上传类替换成 ThinkPHP 3.2.3 中的上传类. ① 下载编辑器(下载地址:http ...

  7. webpy分页类 + 上传类

    webpy没有分页类.按照php的思路.自己编了一个.数据库用的是sqlite. class Page(object): '''分页类''' def __init__(self,page_size,d ...

  8. ASP.NET 文件上传类 简单好用

    调用: UploadFile uf = new UploadFile(); /*可选参数*/ uf.SetIsUseOldFileName(true);//是否使用原始文件名作为新文件的文件名(默认: ...

  9. PHP多文件上传类

    <?php class Upload{ var $saveName;// 保存名 var $savePath;// 保存路径 var $fileFormat = array('gif','jpg ...

随机推荐

  1. onAttachedToWindow()在整个Activity生命周期的位置及使用

    onAttachedToWindow在整个Activity的生命周期中占据什么位置? 为什么要在onAttachedToWindow中修改窗口尺寸? 一.onAttachedToWindow在Acti ...

  2. 前端复习-01-dom操作包括ie和现代浏览器处理相关

    一.事件流事件流描述的是从页面中接受事件的顺序.IE的事件流是事件冒泡流,而Netscape的事件流是事件捕获流1.事件冒泡事件冒泡,即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接收,然 ...

  3. CentOS下MySQL 5.7.9编译安装

    MySQL 5.7 GA版本的发布,也就是说从现在开始5.7已经可以在生产环境中使用,有任何问题官方都将立刻修复. MySQL 5.7主要特性: 更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化 ...

  4. 转】MyEclipse使用总结——MyEclipse10安装SVN插件

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/3497016.html 感谢! 一.下载SVN插件subclipse 下载地址:http://subclipse. ...

  5. EIGRP默认路由分发的四种方法

    方式一:重发布静态 R2(config)#ip route 0.0.0.0 0.0.0.0 s1/1 R2(config)#router eig 10 R2(config-router)#redist ...

  6. C#图解教程读书笔记(第1章 C#和.net框架)

    C#中的主要需要记住的基础概念 CLR公共语言运行库 CIL中间语言,所有的代码都会编译成中间语言. CLI公共语言基础结构 C#的优点 C#有自动垃圾回收机制

  7. Windows消息机制要点

    1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wP ...

  8. 【AS3 Coder】任务七:初涉PureMVC——天气预报功能实现

    转自:http://www.iamsevent.com/post/36.html AS3 Coder]任务七:初涉PureMVC——天气预报功能实现 使用框架:AS3任务描述:了解PureMVC框架使 ...

  9. CSS复合样式

    关于font OK,我们先从font来谈起. 如下一段代码: div{ font-size: 14px; font-family: '\5FAE\8F6F\96C5\9ED1'; font-weigh ...

  10. IOS 手机助手及越狱助手推荐

    快装系列 1 快装助手(PC版) http://pc.kuaiapp.cn/ 2 快装越狱助手(PC版)http://www.kuaiapp.cn 3 快装商店(手机版)http://yueyu.ku ...