加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

做成多文件上传php类

发布时间:2023-05-25 13:03:16 所属栏目:PHP教程 来源:
导读:多文件上传是PHP中的一个基础应用,反正PHPer都会遇到的问题,现在就介绍一个功能完善、强大的多文件上传类给大家吧,能用上这个类的地方会很多,代码如下:<?php class Upload{ var $saveName;// 保存名 var $savePath

多文件上传是PHP中的一个基础应用,反正PHPer都会遇到的问题,现在就介绍一个功能完善、强大的多文件上传类给大家吧,能用上这个类的地方会很多,代码如下:

<?php 

class Upload{ 

 var $saveName;// 保存名 

 var $savePath;// 保存路径 

 var $fileFormat = array('gif','jpg','doc','application/octet-stream');// 文件格式&MIME限定 

 var $overwrite = 0;// 覆盖模式 

 var $maxSize = 0;// 文件最大字节 

 var $ext;// 文件扩展名 

 var $thumb = 0;// 是否生成缩略图 

 var $thumbWidth = 130;// 缩略图宽 

 var $thumbHeight = 130;// 缩略图高 

 var $thumbPrefix = "_thumb_";// 缩略图前缀 

 var $errno;// 错误代号 

 var $returnArray= array();// 所有文件的返回信息 

 var $returninfo= array();// 每个文件返回信息 

// 构造函数 

// @param $savePath 文件保存路径 

// @param $fileFormat 文件格式限制数组 

// @param $maxSize 文件最大尺寸 

// @param $overwriet 是否覆盖 1 允许覆盖 0 禁止覆盖 

 function Upload($savePath, $fileFormat='',$maxSize = 0, $overwrite = 0) { 

  $this->setSavepath($savePath); 

  $this->setFileformat($fileFormat); 

  $this->setMaxsize($maxSize); 

  $this->setOverwrite($overwrite); 

  $this->setThumb($this->thumb, $this->thumbWidth,$this->thumbHeight); 

  $this->errno = 0; 

 } 

// 上传 

// @param $fileInput 网页Form(表单)中input的名称 

// @param $changeName 是否更改文件名 

 function run($fileInput,$changeName = 1){ 

  if(isset($_FILES[$fileInput])){ 

   $fileArr = $_FILES[$fileInput]; 

   if(is_array($fileArr['name'])){//上传同文件域名称多个文件 

    for($i = 0; $i < count($fileArr['name']); $i++){ 

     $ar['tmp_name'] = $fileArr['tmp_name'][$i]; 

     $ar['name'] = $fileArr['name'][$i]; 

     $ar['type'] = $fileArr['type'][$i]; 

     $ar['size'] = $fileArr['size'][$i]; 

     $ar['error'] = $fileArr['error'][$i]; 

     $this->getExt($ar['name']);//取得扩展名,赋给$this->ext,下次循环会更新 

     $this->setSavename($changeName == 1 ? '' : $ar['name']);//设置保存文件名 

     if($this->copyfile($ar)){ 

      $this->returnArray[] =  $this->returninfo; 

     }else{ 

      $this->returninfo['error'] = $this->errmsg(); 

      $this->returnArray[] =  $this->returninfo; 

     } 

    } 

    return $this->errno ?  false :  true; 

   }else{//上传单个文件 

    $this->getExt($fileArr['name']);//取得扩展名 

    $this->setSavename($changeName == 1 ? '' : $fileArr['name']);//设置保存文件名 

    if($this->copyfile($fileArr)){ 

     $this->returnArray[] =  $this->returninfo; 

    }else{ 

     $this->returninfo['error'] = $this->errmsg(); 

     $this->returnArray[] =  $this->returninfo; 

    } 

    return $this->errno ?  false :  true; 

   } 

   return false; 

  }else{ 

   $this->errno = 10; 

   return false; 

  } 

 } 

// 单个文件上传 

// @param $fileArray 文件信息数组 

 function copyfile($fileArray){ 

  $this->returninfo = array(); 

  // 返回信息 

  $this->returninfo['name'] = $fileArray['name']; 

  $this->returninfo['md5'] = @md5_file($fileArray['tmp_name']); 

  $this->returninfo['saveName'] = $this->saveName; 

  $this->returninfo['size'] = number_format( ($fileArray['size'])/1024 , 0, '.', ' ');//以KB为单位 

  $this->returninfo['type'] = $fileArray['type']; 

  // 检查文件格式 

  if (!$this->validateFormat()){ 

   $this->errno = 11; 

   return false; 

  } 

  // 检查目录是否可写 

  if(!@is_writable($this->savePath)){ 

   $this->errno = 12; 

   return false; 

  } 

  // 如果不允许覆盖,检查文件是否已经存在 

  //if($this->overwrite == 0 && @file_exists($this->savePath.$fileArray['name'])){ 

  // $this->errno = 13; 

  // return false; 

  //} 

  // 如果有大小限制,检查文件是否超过限制 

  if ($this->maxSize != 0 ){ 

   if ($fileArray["size"] > $this->maxSize){ 

    $this->errno = 14; 

    return false; 

   } 

  } 

  // 文件上传 

  if(!@move_uploaded_file($fileArray["tmp_name"], $this->savePath.$this->saveName)){ 

   $this->errno = $fileArray["error"]; 

   return false; 

  }elseif( $this->thumb ){// 创建缩略图 

   $CreateFunction = "imagecreatefrom".($this->ext == 'jpg' ? 'jpeg' : $this->ext); 

   $SaveFunction = "image".($this->ext == 'jpg' ? 'jpeg' : $this->ext); 

   if (strtolower($CreateFunction) == "imagecreatefromgif"  

    && !function_exists("imagecreatefromgif")) { 

    $this->errno = 16; 

    return false; 

   } elseif (strtolower($CreateFunction) == "imagecreatefromjpeg"  

    && !function_exists("imagecreatefromjpeg")) { 

    $this->errno = 17; 

    return false; 

   } elseif (!function_exists($CreateFunction)) { 

    $this->errno = 18; 

    return false; 

   } 

   $Original = @$CreateFunction($this->savePath.$this->saveName); 

   if (!$Original) {$this->errno = 19; return false;} 

   $originalHeight = ImageSY($Original); 

   $originalWidth = ImageSX($Original); 

   $this->returninfo['originalHeight'] = $originalHeight; 

   $this->returninfo['originalWidth'] = $originalWidth; 

   /* 

   if (($originalHeight < $this->thumbHeight  

    && $originalWidth < $this->thumbWidth)) { 

    // 如果比期望的缩略图小,那只Copy 

    move_uploaded_file($this->savePath.$this->saveName,  

     $this->savePath.$this->thumbPrefix.$this->saveName); 

   } else { 

    if( $originalWidth > $this->thumbWidth ){// 宽 > 设定宽度 

     $thumbWidth = $this->thumbWidth ; 

     $thumbHeight = $this->thumbWidth * ( $originalHeight / $originalWidth ); 

     if($thumbHeight > $this->thumbHeight){// 高 > 设定高度 

      $thumbWidth = $this->thumbHeight * ( $thumbWidth / $thumbHeight ); 

      $thumbHeight = $this->thumbHeight ; 

     } 

    }elseif( $originalHeight > $this->thumbHeight ){// 高 > 设定高度 

     $thumbHeight = $this->thumbHeight ; 

     $thumbWidth = $this->thumbHeight * ( $originalWidth / $originalHeight ); 

     if($thumbWidth > $this->thumbWidth){// 宽 > 设定宽度 

      $thumbHeight = $this->thumbWidth * ( $thumbHeight / $thumbWidth ); 

      $thumbWidth = $this->thumbWidth ; 

     } 

    } 

    */ 

    $radio=max(($originalWidth/$this->thumbWidth),($originalHeight/$this->thumbHeight)); 

    $thumbWidth=(int)$originalWidth/$radio; 

    $thumbHeight=(int)$originalHeight/$radio; 

    if ($thumbWidth == 0) $thumbWidth = 1; 

    if ($thumbHeight == 0) $thumbHeight = 1; 

    $createdThumb = imagecreatetruecolor($thumbWidth, $thumbHeight); 

    if ( !$createdThumb ) {$this->errno = 20; return false;} 

    if ( !imagecopyresampled($createdThumb, $Original, 0, 0, 0, 0,  

     $thumbWidth, $thumbHeight, $originalWidth, $originalHeight) ) 

     {$this->errno = 21; return false;} 

    if ( !$SaveFunction($createdThumb,  

     $this->savePath.$this->thumbPrefix.$this->saveName) ) 

     {$this->errno = 22; return false;} 

  } 

  // 删除临时文件 

  /* 

  if(!@$this->del($fileArray["tmp_name"])){ 

   return false; 

  } 

  */ 

  return true; 

 } 

// 文件格式检查,MIME检测 

 function validateFormat(){ 

  if(!is_array($this->fileFormat)  

   || in_array(strtolower($this->ext), $this->fileFormat)  

   || in_array(strtolower($this->returninfo['type']), $this->fileFormat) ) 

   return true; 

  else 

   return false; 

 } 

// 获取文件扩展名 

// @param $fileName 上传文件的原文件名 

 function getExt($fileName){ 

  $ext = explode(".", $fileName); 

  $ext = $ext[count($ext) - 1]; 

  $this->ext = strtolower($ext); 

 } 

// 设置上传文件的最大字节限制 

// @param $maxSize 文件大小(bytes) 0:表示无限制 

 function setMaxsize($maxSize){ 

  $this->maxSize = $maxSize; 

 } 

// 设置文件格式限定 

// @param $fileFormat 文件格式数组 

 function setFileformat($fileFormat){ 

  if(is_array($fileFormat)){$this->fileFormat = $fileFormat ;} 

 } 

// 设置覆盖模式 

// @param overwrite 覆盖模式 1:允许覆盖 0:禁止覆盖 

 function setOverwrite($overwrite){ 

  $this->overwrite = $overwrite; 

 } 

 

// 设置保存路径 

// @param $savePath 文件保存路径:以 "/" 结尾,若没有 "/",则补上 

 function setSavepath($savePath){ 

  $this->savePath = substr( str_replace("/","/", $savePath) , -1) == "/"  

  ? $savePath : $savePath."/"; 

 } 

// 设置缩略图 

// @param $thumb = 1 产生缩略图 $thumbWidth,$thumbHeight 是缩略图的宽和高 

 function setThumb($thumb, $thumbWidth = 0,$thumbHeight = 0){ 

  $this->thumb = $thumb; 

  if($thumbWidth) $this->thumbWidth = $thumbWidth; 

  if($thumbHeight) $this->thumbHeight = $thumbHeight; 

 } 

// 设置文件保存名 

// @param $saveName 保存名,如果为空,则系统自动生成一个随机的文件名 

 function setSavename($saveName){ 

  if ($saveName == ''){  // 如果未设置文件名,则生成一个随机文件名 

   $name = date('YmdHis')."_".rand(100,999).'.'.$this->ext; 

   //判断文件是否存在,不允许重复文件 

   if(file_exists($this->savePath . $name)){ 

    $name = setSavename($saveName); 

    } 

  } else { 

   $name = $saveName; 

  } 

  $this->saveName = $name; 

 } 

// 删除文件 

// @param $fileName 所要删除的文件名 

 function del($fileName){ 

  if(!@unlink($fileName)){ 

   $this->errno = 15; 

   return false; 

  } 

  return true; 

 } 

// 返回上传文件的信息 

 function getInfo(){ 

  return $this->returnArray; 

 } 

// 得到错误信息 

 function errmsg(){ 

  $uploadClassError = array( 

   0 =>'There is no error, the file uploaded with success. ', 

   1 =>'The uploaded file exceeds the upload_max_filesize directive in php.ini.', 

   2 =>'The uploaded file exceeds the MAX_FILE_SIZE that was specified in the HTML form.', 

   3 =>'The uploaded file was only partially uploaded. ', 

   4 =>'No file was uploaded. ', 

   6 =>'Missing a temporary folder. Introduced in PHP 4.3.10 and PHP 5.0.3. ', 

   7 =>'Failed to write file to disk. Introduced in PHP 5.1.0. ', 

   10 =>'Input name is not unavailable!', 

   11 =>'The uploaded file is Unallowable!', 

   12 =>'Directory unwritable!', 

   13 =>'File exist already!', 

   14 =>'File is too big!', 

   15 =>'Delete file unsuccessfully!', 

   16 =>'Your version of PHP does not appear to have GIF thumbnailing support.', 

   17 =>'Your version of PHP does not appear to have JPEG thumbnailing support.', 

   18 =>'Your version of PHP does not appear to have pictures thumbnailing support.', 

   19 =>'An error occurred while attempting to copy the source image .  

     Your version of php ('.phpversion().') may not have this image type support.', 

   20 =>'An error occurred while attempting to create a new image.', 

   21 =>'An error occurred while copying the source image to the thumbnail image.', 

   22 =>'An error occurred while saving the thumbnail image to the filesystem.  

     Are you sure that PHP has been configured with both read and write access on this folder?', 

   ); 

  if ($this->errno == 0) 

   return false; 

  else 

   return $uploadClassError[$this->errno]; 

 } 

?> 

如何使用这个类呢? 

<?php 

//如果收到表单传来的参数,则进行上传处理,否则显示表单 

if(isset($_FILES['uploadinput'])){ 

 //建目录函数,其中参数$directoryName最后没有"/", 

 //要是有的话,以'/'打散为数组的时候,最后将会出现一个空值 

 function makeDirectory($directoryName) { 

  $directoryName = str_replace("/","/",$directoryName); 

  $dirNames = explode('/', $directoryName); 

  $total = count($dirNames) ; 

  $temp = ''; 

  for($i=0; $i<$total; $i++) { 

   $temp .= $dirNames[$i].'/'; 

   if (!is_dir($temp)) { 

    $oldmask = umask(0); 

    if (!mkdir($temp, 0777)) exit("不能建立目录 $temp");  

    umask($oldmask); 

   } 

  } 

  return true; 

 } 

 if($_FILES['uploadinput']['name'] <> ""){ 

  //包含上传文件类 

  require_once ('upload_class.php'); 

  //设置文件上传目录 

  $savePath = "upload"; 

  //创建目录 

  makeDirectory($savePath); 

  //允许的文件类型 

  $fileFormat = array('gif','jpg','jpge','png'); 

  //文件大小限制,单位: Byte,1KB = 1000 Byte 

  //0 表示无限制,但受php.ini中upload_max_filesize设置影响 

  $maxSize = 0; 

  //覆盖原有文件吗? 0 不允许  1 允许  

  $overwrite = 0; 

  //初始化上传类 

  $f = new Upload( $savePath, $fileFormat, $maxSize, $overwrite); 

  //如果想生成缩略图,则调用成员函数 $f->setThumb(); 

  //参数列表: setThumb($thumb, $thumbWidth = 0,$thumbHeight = 0) 

  //$thumb=1 表示要生成缩略图,不调用时,其值为 0 

  //$thumbWidth  缩略图宽,单位是像素(px),留空则使用默认值 130 

  //$thumbHeight 缩略图高,单位是像素(px),留空则使用默认值 130 

  $f->setThumb(1); 

  //参数中的uploadinput是表单中上传文件输入框input的名字 

  //后面的0表示不更改文件名,若为1,则由系统生成随机文件名 

  if (!$f->run('uploadinput',1)){ 

   //通过$f->errmsg()只能得到最后一个出错的信息, 

   //详细的信息在$f->getInfo()中可以得到。 

   echo $f->errmsg()."<br>n"; 

  } 

  //上传结果保存在数组returnArray中。 

  echo "<pre>"; 

  print_r($f->getInfo()); 

  echo "</pre>"; 

 } 

}else{ 

?> 

<form enctype="multipart/form-data" action="" method="POST"> 

Send this file: <br /> 

<input name="uploadinput[]" type="file"><br /> 

<input name="uploadinput[]" type="file"><br /> 

<input name="uploadinput[]" type="file"><br /> 

<input type="submit" value="Send File"><br /> 

</form>  

<?php 

?> 

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!