栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

一个经典的PHP文件上传类分享

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一个经典的PHP文件上传类分享

文件上传是项目开发中比较常见的功能,但文件上传的过程比较繁琐,只要是有文件上传的地方就需要编写这些复杂的代码。为了能在每次开发中降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中。帮助开发者在以后的开发中,通过编写几条简单代码就可以实现复杂的文件上传功能。对于基础薄弱的读者,只要会使用本类即可,而对一些喜欢挑战的朋友,可以尝试去读懂它,并能开发一个属于自己的文件上传类。

一、需求分析

  要球自定义文件上传类,即在使用非常简便的前提下,又可以完成以下几项功能:
  ①支持单个文件上传。
  ②支持多个文件上传。
  ③可以自己指定上传文件的保存位置,可以设置上传文件允许的大小和类型,可以由系统对上传文件重新命名,又可以设置保留上传文件的原名。
  (说明:要求单个文件上传和多个文件上传要采用同样的操作方式,对上传进行的一些设置也要采用相同的方式)。

二、程序设计

  根据程序需求的要求,我们可以为文件上传类声明4个可见的成员属性,让用户在使用时还可以进行一些行为的设置。需要的成员属性如下表所示:

  为避免属性的值被赋上一些非法值,需要将这些成员属性封装起来,在对象外面不能访问,再通过类中声明的set()方法为以上四个成员属性赋值。set()方法有两个参数,第一个参数就是成员属性名称(不区分大小写),第二个参数,就是前面参数中属性对应的值。set()方法调用完成以后,返回本对象($this),所以除了可以单独为每个属性赋值以外,还可以进行连贯操作一起为多个属性赋值。本例中除了set()方法以外,最主要的是实现上传文件的功能,所以系统主要提供了以下一些公有方法,实现文件上传的操作,如下表所示:

 为避免属性的值被赋上一些非法值,需要将这些成员属性封装起来,在对象外面不能访问,再通过类中声明的set()方法为以上四个成员属性赋值。set()方法有两个参数,第一个参数就是成员属性名称(不区分大小写),第二个参数,就是前面参数中属性对应的值。set()方法调用完成以后,返回本对象($this),所以除了可以单独为每个属性赋值以外,还可以进行连贯操作一起为多个属性赋值。本例中除了set()方法以外,最主要的是实现上传文件的功能,所以系统主要提供了以下一些公有方法,实现文件上传的操作,如下表所示:

setOption($key, $val);
      }
      return $this;
    }
 
    
 
    function upload($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)){    
 $errors=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{
     $errors[] = $this->getError();
     $return=false;
   }
   
   if(!$return)   
     $this->setFiles();
 }
 
 if($return){
   
   $fileNames = array();      
   
   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;
}
$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; 
 }
 //如果$return为false, 则出错,将错误信息保存在属性errorMess中
 if(!$return)
   $this->errorMess=$this->getError();  
 
 return $return;
      }
    }
 
    
    public function getFileName(){
      return $this->newFileName;
    }
 
    
    public function getErrorMsg(){
      return $this->errorMess;
    }
 
    
    private function getError() {
      $str = "上传文件{$this->originName}时出错 : ";
      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.'
'; } 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); $aryStr = explode(".", $name); $this->setOption('fileType', strtolower($aryStr[count($aryStr)-1])); $this->setOption('fileSize', $size); return true; } private function setOption($key, $val) { $this->$key = $val; } private function setNewFileName() { if ($this->israndname) { $this->setOption('newFileName', $this->proRandName()); } else{ $this->setOption('newFileName', $this->originName); } } private function checkFileType() { if (in_array(strtolower($this->fileType), $this->allowtype)) { return true; }else { $this->setOption('errorNum', -1); return false; } } private function checkFileSize() { if ($this->fileSize > $this->maxsize) { $this->setOption('errorNum', -2); return false; }else{ return true; } } private function checkFilePath() { if(empty($this->path)){ $this->setOption('errorNum', -5); return false; } if (!file_exists($this->path) || !is_writable($this->path)) { if (!@mkdir($this->path, 0755)) { $this->setOption('errorNum', -4); return false; } } return true; } private function proRandName() { $fileName = date('YmdHis')."_".rand(100,999); return $fileName.'.'.$this->fileType; } private function copyFile() { if(!$this->errorNum) { $path = rtrim($this->path, '/').'/'; $path .= $this->newFileName; if (@move_uploaded_file($this->tmpFileName, $path)) { return true; }else{ $this->setOption('errorNum', -3); return false; } } else { return false; } } }

四、文件上传类的应用过程

  本例的文件上传类FileUpload,即支持单文件上传,也支持多个文件一起向服务器上传,在处理方式上没有区别的,只不过在编写上传标单时,多个文件上传一定要以数组方式传递给服务器。单个文件上传表单如下所示:



  上面表单,都将提交的位置指向了同一个文件upload.php,所以不难看出单个和多个文件上传是一样的处理方式,upload.php代码如下所示:

 set("path", "./images/");
    $up -> set("maxsize", 2000000);
    $up -> set("allowtype", array("gif", "png", "jpg","jpeg"));
    $up -> set("israndname", false);
 
    //使用对象中的upload方法, 就可以上传文件, 方法需要传一个上传表单的名子 pic, 如果成功返回true, 失败返回false
    if($up -> upload("pic")) {
        echo '
';
        //获取上传后文件名子
        var_dump($up->getFileName());
        echo '
';       } else {         echo '
';
        //获取上传失败以后的错误提示
        var_dump($up->getErrorMsg());
        echo '
';     } ?>

  在upload.php文件中,首先必须加载文件上传FileUpload类所在的文件fileupload.class.php。再就是实例化文件上传类的对象,然后通过调用upload()方法上传文件,如果上传成功,可以通过getFileName()方法获取上传后的文件名称,如果上传失败,还可以通过getErrorMsg()方法获取错误报告。如果需要改变上传的一些行为,可以通过调用set()方法来完成一些属性的设置。set()方法可以单独使用设置一个属性的值,如果需要改变多个属性的值,可以连续调用set()方法进行设置,也可以连贯操作同时设置多个属性。

下载PHP文件上传类:

文件上传类.rar

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/46954.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号