首页 > 语言 > PHP > 正文

实现多文件上传php类

2024-09-04 11:44:01
字体:
来源:转载
供稿:网友

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

  1. <?php 
  2. class Upload{ 
  3.  var $saveName;// 保存名 
  4.  var $savePath;// 保存路径 
  5.  var $fileFormat = array('gif','jpg','doc','application/octet-stream');// 文件格式&MIME限定 
  6.  var $overwrite = 0;// 覆盖模式 
  7.  var $maxSize = 0;// 文件最大字节 
  8.  var $ext;// 文件扩展名 
  9.  var $thumb = 0;// 是否生成缩略图 
  10.  var $thumbWidth = 130;// 缩略图宽 
  11.  var $thumbHeight = 130;// 缩略图高 
  12.  var $thumbPrefix = "_thumb_";// 缩略图前缀 
  13.  var $errno;// 错误代号 
  14.  var $returnArrayarray();// 所有文件的返回信息 
  15.  var $returninfoarray();// 每个文件返回信息 
  16.  
  17. // 构造函数 
  18. // @param $savePath 文件保存路径 
  19. // @param $fileFormat 文件格式限制数组 
  20. // @param $maxSize 文件最大尺寸 
  21. // @param $overwriet 是否覆盖 1 允许覆盖 0 禁止覆盖 
  22.  function Upload($savePath$fileFormat='',$maxSize = 0, $overwrite = 0) { 
  23.   $this->setSavepath($savePath); 
  24.   $this->setFileformat($fileFormat); 
  25.   $this->setMaxsize($maxSize); 
  26.   $this->setOverwrite($overwrite); 
  27.   $this->setThumb($this->thumb, $this->thumbWidth,$this->thumbHeight); 
  28.   $this->errno = 0; 
  29.  } 
  30. // 上传 
  31. // @param $fileInput 网页Form(表单)中input的名称 
  32. // @param $changeName 是否更改文件名 
  33.  function run($fileInput,$changeName = 1){ 
  34.   if(isset($_FILES[$fileInput])){ 
  35.    $fileArr = $_FILES[$fileInput]; 
  36.    if(is_array($fileArr['name'])){//上传同文件域名称多个文件 
  37.     for($i = 0; $i < count($fileArr['name']); $i++){ 
  38.      $ar['tmp_name'] = $fileArr['tmp_name'][$i]; 
  39.      $ar['name'] = $fileArr['name'][$i]; 
  40.      $ar['type'] = $fileArr['type'][$i]; 
  41.      $ar['size'] = $fileArr['size'][$i]; 
  42.      $ar['error'] = $fileArr['error'][$i]; 
  43.      $this->getExt($ar['name']);//取得扩展名,赋给$this->ext,下次循环会更新 
  44.      $this->setSavename($changeName == 1 ? '' : $ar['name']);//设置保存文件名 
  45.      if($this->copyfile($ar)){ 
  46.       $this->returnArray[] =  $this->returninfo; 
  47.      }else
  48.       $this->returninfo['error'] = $this->errmsg(); 
  49.       $this->returnArray[] =  $this->returninfo; 
  50.      } 
  51.     } 
  52.     return $this->errno ?  false :  true; 
  53.    }else{//上传单个文件 
  54.     $this->getExt($fileArr['name']);//取得扩展名 
  55.     $this->setSavename($changeName == 1 ? '' : $fileArr['name']);//设置保存文件名 
  56.     if($this->copyfile($fileArr)){ 
  57.      $this->returnArray[] =  $this->returninfo; 
  58.     }else
  59.      $this->returninfo['error'] = $this->errmsg(); 
  60.      $this->returnArray[] =  $this->returninfo; 
  61.     } 
  62.     return $this->errno ?  false :  true; 
  63.    } 
  64.    return false; 
  65.   }else
  66.    $this->errno = 10; 
  67.    return false; 
  68.   } 
  69.  } 
  70. // 单个文件上传 
  71. // @param $fileArray 文件信息数组 
  72.  function copyfile($fileArray){ 
  73.   $this->returninfo = array(); 
  74.   // 返回信息 
  75.   $this->returninfo['name'] = $fileArray['name']; 
  76.   $this->returninfo['md5'] = @md5_file($fileArray['tmp_name']); 
  77.   $this->returninfo['saveName'] = $this->saveName; 
  78.   $this->returninfo['size'] = number_format( ($fileArray['size'])/1024 , 0, '.'' ');//以KB为单位 
  79.   $this->returninfo['type'] = $fileArray['type']; 
  80.   // 检查文件格式 
  81.   if (!$this->validateFormat()){ 
  82.    $this->errno = 11; 
  83.    return false; 
  84.   } 
  85.   // 检查目录是否可写 
  86.   if(!@is_writable($this->savePath)){ 
  87.    $this->errno = 12; 
  88.    return false; 
  89.   } 
  90.   // 如果不允许覆盖,检查文件是否已经存在 
  91.   //if($this->overwrite == 0 && @file_exists($this->savePath.$fileArray['name'])){ 
  92.   // $this->errno = 13; 
  93.   // return false; 
  94.   //} 
  95.   // 如果有大小限制,检查文件是否超过限制 
  96.   if ($this->maxSize != 0 ){ 
  97.    if ($fileArray["size"] > $this->maxSize){ 
  98.     $this->errno = 14; 
  99.     return false; 
  100.    } 
  101.   } 
  102.   // 文件上传 
  103.   if(!@move_uploaded_file($fileArray["tmp_name"], $this->savePath.$this->saveName)){ 
  104.    $this->errno = $fileArray["error"]; 
  105.    return false; 
  106.   }elseif$this->thumb ){// 创建缩略图 
  107.    $CreateFunction = "imagecreatefrom".($this->ext == 'jpg' ? 'jpeg' : $this->ext); 
  108.    $SaveFunction = "image".($this->ext == 'jpg' ? 'jpeg' : $this->ext); 
  109.    if (strtolower($CreateFunction) == "imagecreatefromgif"  
  110.     && !function_exists("imagecreatefromgif")) { 
  111.     $this->errno = 16; 
  112.     return false; 
  113.    } elseif (strtolower($CreateFunction) == "imagecreatefromjpeg"  
  114.     && !function_exists("imagecreatefromjpeg")) { 
  115.     $this->errno = 17; 
  116.     return false; 
  117.    } elseif (!function_exists($CreateFunction)) { 
  118.     $this->errno = 18; 
  119.     return false; 
  120.    } 
  121.      
  122.    $Original = @$CreateFunction($this->savePath.$this->saveName); 
  123.    if (!$Original) {$this->errno = 19; return false;} 
  124.    $originalHeight = ImageSY($Original); 
  125.    $originalWidth = ImageSX($Original); 
  126.    $this->returninfo['originalHeight'] = $originalHeight
  127.    $this->returninfo['originalWidth'] = $originalWidth
  128.    /* 
  129.    if (($originalHeight < $this->thumbHeight  
  130.     && $originalWidth < $this->thumbWidth)) { 
  131.     // 如果比期望的缩略图小,那只Copy 
  132.     move_uploaded_file($this->savePath.$this->saveName,  
  133.      $this->savePath.$this->thumbPrefix.$this->saveName); 
  134.    } else { 
  135.     if( $originalWidth > $this->thumbWidth ){// 宽 > 设定宽度 
  136.      $thumbWidth = $this->thumbWidth ; 
  137.      $thumbHeight = $this->thumbWidth * ( $originalHeight / $originalWidth ); 
  138.      if($thumbHeight > $this->thumbHeight){// 高 > 设定高度 
  139.       $thumbWidth = $this->thumbHeight * ( $thumbWidth / $thumbHeight ); 
  140.       $thumbHeight = $this->thumbHeight ; 
  141.      } 
  142.     }elseif( $originalHeight > $this->thumbHeight ){// 高 > 设定高度 
  143.      $thumbHeight = $this->thumbHeight ; 
  144.      $thumbWidth = $this->thumbHeight * ( $originalWidth / $originalHeight ); 
  145.      if($thumbWidth > $this->thumbWidth){// 宽 > 设定宽度 
  146.       $thumbHeight = $this->thumbWidth * ( $thumbHeight / $thumbWidth ); 
  147.       $thumbWidth = $this->thumbWidth ; 
  148.      } 
  149.     } 
  150.     */ 
  151.     $radio=max(($originalWidth/$this->thumbWidth),($originalHeight/$this->thumbHeight)); 
  152.     $thumbWidth=(int)$originalWidth/$radio
  153.     $thumbHeight=(int)$originalHeight/$radio
  154.     if ($thumbWidth == 0) $thumbWidth = 1; 
  155.     if ($thumbHeight == 0) $thumbHeight = 1; 
  156.     $createdThumb = imagecreatetruecolor($thumbWidth$thumbHeight); 
  157.     if ( !$createdThumb ) {$this->errno = 20; return false;} 
  158.     if ( !imagecopyresampled($createdThumb$Original, 0, 0, 0, 0,  
  159.      $thumbWidth$thumbHeight$originalWidth$originalHeight) ) 
  160.      {$this->errno = 21; return false;} 
  161.     if ( !$SaveFunction($createdThumb,  
  162.      $this->savePath.$this->thumbPrefix.$this->saveName) ) 
  163.      {$this->errno = 22; return false;} 
  164.     
  165.   } 
  166.   // 删除临时文件 
  167.   /* 
  168.   if(!@$this->del($fileArray["tmp_name"])){ 
  169.    return false; 
  170.   } 
  171.   */ 
  172.   return true; 
  173.  } 
  174. // 文件格式检查,MIME检测 
  175.  function validateFormat(){ 
  176.   if(!is_array($this->fileFormat)  
  177.    || in_array(strtolower($this->ext), $this->fileFormat)  
  178.    || in_array(strtolower($this->returninfo['type']), $this->fileFormat) ) 
  179.    return true; 
  180.   else 
  181.    return false; 
  182.  } 
  183. // 获取文件扩展名 
  184. // @param $fileName 上传文件的原文件名 
  185.  function getExt($fileName){ 
  186.   $ext = explode("."$fileName); 
  187.   $ext = $ext[count($ext) - 1]; 
  188.   $this->ext = strtolower($ext); 
  189.  } 
  190. // 设置上传文件的最大字节限制 
  191. // @param $maxSize 文件大小(bytes) 0:表示无限制 
  192.  function setMaxsize($maxSize){ 
  193.   $this->maxSize = $maxSize
  194.  } 
  195. // 设置文件格式限定 
  196. // @param $fileFormat 文件格式数组 
  197.  function setFileformat($fileFormat){ 
  198.   if(is_array($fileFormat)){$this->fileFormat = $fileFormat ;} 
  199.  } 
  200. // 设置覆盖模式 
  201. // @param overwrite 覆盖模式 1:允许覆盖 0:禁止覆盖 
  202.  function setOverwrite($overwrite){ 
  203.   $this->overwrite = $overwrite
  204.  } 
  205.  
  206. // 设置保存路径 
  207. // @param $savePath 文件保存路径:以 "/" 结尾,若没有 "/",则补上 
  208.  function setSavepath($savePath){ 
  209.   $this->savePath = substrstr_replace("/","/", $savePath) , -1) == "/"  
  210.   ? $savePath : $savePath."/"
  211.  } 
  212. // 设置缩略图 
  213. // @param $thumb = 1 产生缩略图 $thumbWidth,$thumbHeight 是缩略图的宽和高 
  214.  function setThumb($thumb$thumbWidth = 0,$thumbHeight = 0){ 
  215.   $this->thumb = $thumb
  216.   if($thumbWidth$this->thumbWidth = $thumbWidth
  217.   if($thumbHeight$this->thumbHeight = $thumbHeight
  218.  } 
  219. // 设置文件保存名 
  220. // @param $saveName 保存名,如果为空,则系统自动生成一个随机的文件名 
  221.  function setSavename($saveName){ 
  222.   if ($saveName == ''){  // 如果未设置文件名,则生成一个随机文件名 
  223.    $name = date('YmdHis')."_".rand(100,999).'.'.$this->ext; 
  224.    //判断文件是否存在,不允许重复文件 
  225.    if(file_exists($this->savePath . $name)){ 
  226.     $name = setSavename($saveName); 
  227.     } 
  228.   } else { 
  229.    $name = $saveName
  230.   } 
  231.   $this->saveName = $name
  232.  } 
  233. // 删除文件 
  234. // @param $fileName 所要删除的文件名 
  235.  function del($fileName){ 
  236.   if(!@unlink($fileName)){ 
  237.    $this->errno = 15; 
  238.    return false; 
  239.   } 
  240.   return true; 
  241.  } 
  242. // 返回上传文件的信息 
  243.  function getInfo(){ 
  244.   return $this->returnArray; 
  245.  } 
  246. // 得到错误信息 
  247.  function errmsg(){ 
  248.   $uploadClassError = array
  249.    0 =>'There is no error, the file uploaded with success. '
  250.    1 =>'The uploaded file exceeds the upload_max_filesize directive in php.ini.'
  251.    2 =>'The uploaded file exceeds the MAX_FILE_SIZE that was specified in the HTML form.'
  252.    3 =>'The uploaded file was only partially uploaded. '
  253.    4 =>'No file was uploaded. '
  254.    6 =>'Missing a temporary folder. Introduced in PHP 4.3.10 and PHP 5.0.3. '
  255.    7 =>'Failed to write file to disk. Introduced in PHP 5.1.0. '
  256.    10 =>'Input name is not unavailable!'
  257.    11 =>'The uploaded file is Unallowable!'
  258.    12 =>'Directory unwritable!'
  259.    13 =>'File exist already!'
  260.    14 =>'File is too big!'
  261.    15 =>'Delete file unsuccessfully!'
  262.    16 =>'Your version of PHP does not appear to have GIF thumbnailing support.'
  263.    17 =>'Your version of PHP does not appear to have JPEG thumbnailing support.'
  264.    18 =>'Your version of PHP does not appear to have pictures thumbnailing support.'
  265.    19 =>'An error occurred while attempting to copy the source image .  
  266.      Your version of php ('.phpversion().') may not have this image type support.', 
  267.    20 =>'An error occurred while attempting to create a new image.'
  268.    21 =>'An error occurred while copying the source image to the thumbnail image.'
  269.    22 =>'An error occurred while saving the thumbnail image to the filesystem.  
  270.      Are you sure that PHP has been configured with both read and write access on this folder?', 
  271.    ); 
  272.   if ($this->errno == 0) 
  273.    return false; 
  274.   else 
  275.    return $uploadClassError[$this->errno]; 
  276.  } 
  277. ?> 
  278. 如何使用这个类呢? 
  279. <?php 
  280. //如果收到表单传来的参数,则进行上传处理,否则显示表单 
  281. if(isset($_FILES['uploadinput'])){ 
  282.  //建目录函数,其中参数$directoryName最后没有"/", 
  283.  //要是有的话,以'/'打散为数组的时候,最后将会出现一个空值 
  284.  function makeDirectory($directoryName) { 
  285.   $directoryName = str_replace("/","/",$directoryName); 
  286.   $dirNames = explode('/'$directoryName); 
  287.   $total = count($dirNames) ; 
  288.   $temp = ''
  289.   for($i=0; $i<$total$i++) { 
  290.    $temp .= $dirNames[$i].'/'
  291.    if (!is_dir($temp)) { 
  292.     $oldmask = umask(0); 
  293.     if (!mkdir($temp, 0777)) exit("不能建立目录 $temp");  
  294.     umask($oldmask); 
  295.    } 
  296.   } 
  297.   return true; 
  298.  } 
  299.  if($_FILES['uploadinput']['name'] <> ""){ 
  300.   //包含上传文件类 
  301.   require_once ('upload_class.php'); 
  302.   //设置文件上传目录 
  303.   $savePath = "upload"
  304.   //创建目录 
  305.   makeDirectory($savePath); 
  306.   //允许的文件类型 
  307.   $fileFormat = array('gif','jpg','jpge','png'); 
  308.   //文件大小限制,单位: Byte,1KB = 1000 Byte 
  309.   //0 表示无限制,但受php.ini中upload_max_filesize设置影响 
  310.   $maxSize = 0; 
  311.   //覆盖原有文件吗? 0 不允许  1 允许  
  312.   $overwrite = 0; 
  313.   //初始化上传类 
  314.   $f = new Upload( $savePath$fileFormat$maxSize$overwrite); 
  315.   //如果想生成缩略图,则调用成员函数 $f->setThumb(); 
  316.   //参数列表: setThumb($thumb, $thumbWidth = 0,$thumbHeight = 0) 
  317.   //$thumb=1 表示要生成缩略图,不调用时,其值为 0 
  318.   //$thumbWidth  缩略图宽,单位是像素(px),留空则使用默认值 130 
  319.   //$thumbHeight 缩略图高,单位是像素(px),留空则使用默认值 130 
  320.   $f->setThumb(1); 
  321.    
  322.   //参数中的uploadinput是表单中上传文件输入框input的名字 
  323.   //后面的0表示不更改文件名,若为1,则由系统生成随机文件名 
  324.   if (!$f->run('uploadinput',1)){ 
  325.    //通过$f->errmsg()只能得到最后一个出错的信息, 
  326.    //详细的信息在$f->getInfo()中可以得到。 
  327.    echo $f->errmsg()."<br>n"
  328.   } 
  329.   //上传结果保存在数组returnArray中。 
  330.   echo "<pre>"
  331.   print_r($f->getInfo()); 
  332.   echo "</pre>"
  333.  } 
  334. }else
  335. ?> 
  336. <form enctype="multipart/form-data" action="" method="POST"
  337. Send this file: <br /> 
  338. <input name="uploadinput[]" type="file"><br /> 
  339. <input name="uploadinput[]" type="file"><br /> 
  340. <input name="uploadinput[]" type="file"><br /> 
  341. <input type="submit" value="Send File"><br /> 
  342. </form>  
  343. <?php 
  344. ?> 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表