设计文件上传类

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. 非官方的iOS设计指南

    非官方的iOS设计指南 有时候为iOS设计app并不是一件简单的事,但是如果你能找到正确的最新的苹果设备信息,并按照正确的方向,那么为iOS设计app或许会变得简单容易些. 关于这些指南 这些指南描述 ...

  2. TCP包头

    每发一个包,不论大小协议头会占用一定的空间 TCP头20字节,IP头20字节,MAC头14字节,共54字节 //Mac头部,总长度14字节  typedef struct _eth_hdr  {    ...

  3. POP3&SMTP&IMAP

    [POP3&SMTP&IMAP] IMAP是什么? IMAP,即Internet Message Access Protocol(互联网邮件访问协议),您可以通过这种协议从邮件服务器上 ...

  4. 一键安装GitLab7

    1. Install and configure the necessary dependencies If you install Postfix to send email please sele ...

  5. PetaPoco T4模板修改生成实体

    PetaPoco T4 模板生成的实体类全部包含再一个.CS文件中.通过修改PetaPoco的T4模板,生成单文件实体. 1.生成单CS文件模板: SigleFile.ttinclude <#@ ...

  6. 《dive into python3》 笔记摘录

    1.list can hold  arbitrary  objects and can expand dynamically as new items are added. A list is an  ...

  7. 使用sql访问EXECL文件

    --使用sql语句打开访问EXECL文件 --SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDat ...

  8. CountDownLatch和CyclicBarrier的区别

    [CountDownLatch.CyclicBarrier和Semaphore]http://www.cnblogs.com/dolphin0520/p/3920397.html   [CountDo ...

  9. 传参方式由url携带改为post提交

    参考:http://www.cnblogs.com/logon/p/3218834.html 我们这里使用了iframe嵌套form表单POST提交,很简单,却能满足get|post等任何复杂情况的要 ...

  10. 28.怎样在Swift中实现单例?

    1.回忆一下OC中的单例实现 //AFNetworkReachabilityManager中的单例,省略了其他代码 @interface AFNetworkReachabilityManager : ...