PHP實(shí)現(xiàn)的多文件上傳類及用法示例

字號:


    本文實(shí)例講述了PHP實(shí)現(xiàn)的多文件上傳類及用法。分享給大家供大家參考,具體如下:
    1、upFiles.css.php 文件
    <?php
    class UploadFiles{
     private $maxsize = '1000000'; //允許上傳文件最大長度
     private $allowtype = array('jpg','png','gif','jpeg');//允許上傳文件類型
     private $israndfile = true;//是否隨機(jī)文件名
     private $filepath;//上傳路徑
     private $originName;//上傳的源文件
     private $tmpfileName;//臨時(shí)文件名
     private $newfileName;//新文件名
     private $fileSize;//文件大小
     private $fileType;//文件類型
     private $errorNum = 0;//錯(cuò)誤號
     private $errorMessg = array();//錯(cuò)誤消息
     //對成員初始化
     function __construct($options = array()){
     foreach($options as $key=>$val){
      $key = strtolower($key);
      //查看傳進(jìn)來的數(shù)組里下標(biāo)是否與成員屬性相同
      //print_r(array_keys(get_class_vars(get_class($this))));
      if(!in_array($key,array_keys(get_class_vars(get_class($this))))){
      continue;
      }else{
      $this->setOption($key,$val);
      }
     }
     }
     private function setOption($key,$val){
       $this->$key = $val;
     //echo $this->errorNum."<br>";
     }
     //檢查文件上傳路徑
     private function checkfilePath(){
     //echo $this->filepath;
     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;
     }
     //獲取錯(cuò)誤信息
     private function getError(){
     $str = "上傳文件{$this->originName}出錯(cuò)---";
     switch($this->errorNum){
      case 4; $str .= "沒有文件被上傳";break;
      case 3; $str .= "文件只被部分上傳";break;
      case 2; $str .= "超過文件表單允許大小";break;
      case 1; $str .= "超過php.ini中允許大小";break;
      case -1; $str .= "未允許的類型";break;
      case -2; $str .= "文件過大,不能超過".$this->maxsize."個(gè)字節(jié)";break;
      case -3; $str .= "上傳失敗";break;
      case -4; $str .= "建立文件上傳目錄失敗";break;
      case -5; $str .= "必須指定上傳路徑";break;
      default; $str .= "未知錯(cuò)誤";
     }
     return $str."<br>";
     }
     //檢查文件類型
     private function checkfileType(){
     //echo $this->fileType;
     if(!in_array(strtolower($this->fileType),$this->allowtype)){
     $this->setOption('errorNum','-1');
      return false;
     }else{
      return true;
     }
     }
     //檢查文件大小
     private function checkfileSize(){
     if($this->fileSize > $this->maxsize){
      $this->setOption('errorNum','-2');
      return false;
     }else{
      return true;
     }
     }
     //處理隨機(jī)文件名稱
     private function prorandFile(){
     $ch = $this->israndfile;
     if($ch == 'true'){
      return true;
     }else{
      return false;
     }
     }
     //
     private function setFiles($name="",$tmp_name="",$size="",$error=""){
     //檢查上傳路徑
     if(!$this->checkfilePath()){
      //$this->errorMessg = $this->getError();
      return false;
     }
     //echo $error."<br>";
     if($error){
     $this->setOption('errorNum',$error);
      return false;
     }
     $arrstr  = explode('.',$name);
     $type   = end($arrstr);
     $this->setOption('originName',$name);
     $this->setOption('fileSize',$size);
     $this->setOption('fileType',$type);
     $this->setOption('tmpfileName',$tmp_name);
     return true;
     }
     //檢查是否有文件上傳
     function checkFile($formname){
     if(!@$_FILES[$formname]){
      $this->setOption('errorNum',4);
      return false;
     }else{
      return true;
     }
     }
     //上傳文件
     function uploadeFile($formname){
     if(!$this->checkFile($formname)){
      $this->errorMessg = $this->getError();
      return false;
     }
     $return  = true;
     $name   = @$_FILES[$formname]['name'];
     $tmp_name = @$_FILES[$formname]['tmp_name'];
     $size   = @$_FILES[$formname]['size'];
     $error  = @$_FILES[$formname]['error'];
     //$type   = $_FILES[$formname]['type'];
     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){
      $newfileN = array();
      for($i=0; $i<count($name); $i++){
       if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i])){
       if(!$this->copyFile()){
        $errors[] = $this->getError();
        $return = false;
       }else{
        $newfileN[] = $this->newfileName;
       }
       }
       $this->newfileName = $newfileN;
      }
      }
      //print_r($errors);
      $this->errorMessg = $errors;
      //echo $errors;
      return $return;
     }else{
      if($this->setFiles($name,$tmp_name,$size,$error)){
      $return = true;
      if($error) var_dump($error);
      if($this->checkfileSize() && $this->checkfileType()){
      }else{
       $return = false;
      }
      }else{
      $return = false;
      }
      if(!$return){
      $this->errorMessg = $this->getError();
      }
      return $return;
     }
     }
     //獲取上傳后的文件名
     function getnewFile(){
      return $this->newfileName;
     }
     //把文件拷貝到指定的路徑
     function copyFile(){
     $filepath = rtrim($this->filepath,'/')."/";
     if(!$this->errorNum){
      if($this->prorandFile()){
       $this->newfileName = date('Ymdhis').rand(1000,9999).".".$this->fileType;
      }else{
       $this->newfileName = $this->originName;
      }
      if(!move_uploaded_file($this->tmpfileName,$filepath.$this->newfileName)){
      $this->setOption('errorNum',-3);
      return false;
      }else{
      return true;
      }
     }else{
      return false;
     }
     }
     //上傳錯(cuò)誤后返回的消息
     function gteerror(){
      $err = $this->errorMessg;
     return $err;
     }
     }
    ?>
    2、使用方法
    uploade.php 文件:
    <?php
    //print_r($_FILES['spic']);
    header('Content-Type:text/html;charset=utf-8');
    //if(@$_FILES['spic'])echo "ddddddddd";;
    include('upFiles.css.php');
    $upfile = new UploadFiles(array('filepath'=>'./upload','allowtype'=>array('php','bmp','gif','jpg','png'),'israndfile'=>true,'maxsize'=>'1000000'));
    if($upfile ->uploadeFile('spic')){
     $arrfile = $upfile ->getnewFile();
     foreach($arrfile as $v){
     echo $v,"<br/>";
     }
     echo "上傳成功!";
    }else{
     $err = $upfile ->gteerror();
     if(is_array($err)){
     foreach($err as $v1){
      echo $v1,"<br/>";
     }
     }else{
     echo $err;
     }
     //var_dump($err);
    }
    //var_dump($upfile);
    ?>
    HTML 文件:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>無標(biāo)題文檔</title>
    <script type="text/javascript">
    function Check(){
     //alert('dddd');
     for(i=1; i<9; i++){
     if(document.getElementById('v'+i).value == ''){
      document.getElementById('v'+i).name = 'uu';
     }
     }
    }
    </script>
    </head>
    <body>
    <form name="upfile" action="uploade.php" method="post" enctype="multipart/form-data">
    <input type="file" name="spic[]" id="v1" /><br/>
    <input type="file" name="spic[]" id="v2" /><br/>
    <input type="file" name="spic[]" id="v3" /><br/>
    <input type="file" name="spic[]" id="v4" /><br/>
    <input type="file" name="spic[]" id="v5" /><br/>
    <input type="file" name="spic[]" id="v6" /><br/>
    <input type="file" name="spic[]" id="v7" /><br/>
    <input type="file" name="spic[]" id="v8" /><br/>
    <input type="submit" name="sub" value="提交" onclick="return Check()" />
    <input type="reset" name="res" value="重填" />
    </form>
    </body>
    </html>
    希望本文所述對大家PHP程序設(shè)計(jì)有所幫助。