首页  >  文章  >  php教程  >  多文件上传修改

多文件上传修改

WBOY
WBOY原创
2016-06-07 11:43:391158浏览

之前写文件上传类上传多个文件的话最后只能得到一个文件名,因为原来是用字符串成员变量存储的文件名,所以只能存一个,这侧把存储文件名的变量改为了数组,最后上传完后用户得到的是一个数组,包含了所上传的所有文件
<?php <br /> /**<br>  * FileUpload.class.php<br>  * @Description 多文件上传类<br>  * @author: yulipu<br>  * Time: 2013-10-3<br>  *        include "FileUpload.class.php";<br>  *      $up=new FileUpload(array('savepath'=>'./mytest/'));<br>  *      $up->uploadFile('userfile');  //userfile 为input框的name值 多文件时input 的name值要有中括号: name="userfile[]" 没有中括号只能上传第一个文件<br>  *      echo $up->getErrorMsg();  //得到错误信息<br>  *         <br>  * 基本功能有 都以参数形式传入构造函数<br>  *         指定上传文件格式 [array] allowtype <br>  *         指定文件大小     [int] maxsize<br>  *         <br>  * 实例1 上传头像到指定目录 并以随即名保存 文件名长度为20(默认为20)<br>  *         $up = new FileUpload(array('savepath'=>'./avatar/', 'israndname'=>true, 'newfilenamelength'=>20));<br>  * 实例2 上传头像到指定目录 并且用用户id作为文件名 如上传 photo.png 保存为 2.png<br>  *         $up = new FileUpload(array('savepath'=>'./avatar/', 'israndname'=>false, 'givenfilename'=>2));<br>  * 实例3 上传头像到指定目录 在目录下以日期为单位建立子目录保存头像<br>  *         $up = new FileUpload(array('savepath'=>'./avatar/', 'subdirpattern'=>'Y/m' , 'israndname'=>false, 'givenfilename'=>2));<br>  *         以上生成目录为 './avatar/2013/10'<br>  */<br> class FileUpload {<br>     private $name = 'name';<br>     private $type = 'type';<br>     private $tmp_name = 'tmp_name';<br>     private $error = 'error';<br>     private $size = 'size';<br> <br>     // 构造方法用到的字段<br>     private $savepath = '';  //指定上传文件保存的路径<br>     private $subdirpattern = '';  // 结合savepath使用 为空表示不添加子目录,不为空 比如 'Y/m' 表示 2011/01 那么保存路径就是 $savepath  . '/2011/01'<br>     private $allowtype = array('gif', 'jpg', 'png');<br>     private $maxsize = 204800; //Byte 200K<br>     private $israndname = true;  //是否随机重命名 true false不随机 使用原文件名<br>     private $givenfilename = '';  //使用给定的文件名 配合 israndname 使用<br>     private $ignoreemptyfile = true;  //是否忽略没有上传文件的文本域<br>     private $newfilenamelength = 20;<br>     <br>     // 本类用到的字段<br>     private $errorMessage = '';<br>     private $uploadFileArray = null;<br>     private $originalFileName = '';<br>     private $expandedName = '';<br>     public $newFileName = array();<br>     <br>     <br>     //1. 指定上传路径, 2,充许的类型, 3,限制大小, 4,是否使用随机文件名称<br>     //new FileUpload( array('savepath'=>'./uploads/', 'allowtype'=>array('txt','gif'), 'israndname'=>true) );<br>     public function __construct($args=array()) {<br>         foreach($args as $key => $value) {<br>             $key = strtolower($key);<br>             //查看用户参数中数组的下标是否和成员属性名相同<br>             //if(!in_array( $key, get_class_vars(get_class($this)) )) {<br>             //    continue;<br>             //}<br>             $this->setArgs($key, $value);<br>         }<br>     }<br>     <br>     private function setArgs($key, $value) {<br>         $this->$key = $value;<br>     }<br>     <br>     /**<br>      * 得到文件大小<br>      * @param int size 字节数<br>      */<br>     private function getFileSize($size) {<br>         $unit = 'Bytes';<br>         if($size              return $size.$unit;<br>         } else if($size              $unit = 'KB';<br>             $size = round($size / 1024, 2);<br>         } else if($size              $unit = 'MB';<br>             $size = round($size / pow(1024, 2), 2);<br>         } else if($size              $unit = 'GB';<br>             $size = round($size / pow(1024, 3), 2);<br>         } else {<br>             $unit = 'TB';<br>             $size = round($size / pow(1024, 4), 2);<br>         }<br>         <br>         return $size.$unit;<br>     }<br>     <br>     /**<br>      * 得到一个数组的键组成的数组<br>      */<br>     private function myArray_keys(& $arr) {<br>         $returnArr = array();<br>         foreach($arr as $key => $val) {<br>             $returnArr[] = $key;<br>         }<br>         <br>         return $returnArr;<br>     }<br> /* 没排序时<br> Array<br> (<br>     [f1] => Array<br>         (<br>             [name] => Array<br>                 (<br>                     [0] => Winter.jpg<br>                 )<br>             // 凡是加了[] 这里的name格式就成了数组 这是才能支持多文件<br>             // 凡是不加[] 这里的name格式就是字符串 也就是只能上传第一个文件<br>             <br>             [type] => Array<br>                 (<br>                     [0] => image/jpeg<br>                 )<br> <br>             [tmp_name] => Array<br>                 (<br>                     [0] => C:\WINDOWS\TEMP\php38D.tmp<br>                 )<br> <br>             [error] => Array<br>                 (<br>                     [0] => 0<br>                 )<br> <br>             [size] => Array<br>                 (<br>                     [0] => 105542<br>                 )<br> <br>         )<br> <br> )<br> */<br>     <br>     /**<br>      * 重新排列上传文件<br>      * $uploadFileArray 上传的文件的数组<br>      */<br>     private function reSortFile(& $uploadFileArray) {<br>         // input name没有[] 时是字符串<br>         // 有[] 时是数组<br>         $multiFlag = is_array($uploadFileArray[$this->name]) ? true : false;<br>         $file_arr = array();<br>         <br>         $file_num = $multiFlag ? count($uploadFileArray[$this->name]) : 1;  //计算上传的文件数<br>         $file_keys = $this->myArray_keys($uploadFileArray);  //得到数组,包含了name type error tmp_name size<br>         <br>         for($i=0; $i             foreach($file_keys as $value) {<br>                 $file_arr[$i][$value] = $multiFlag ? $uploadFileArray[$value][$i] : $uploadFileArray[$value];<br>             }<br>         }<br>         <br>         return $file_arr;<br>     }<br>     <br>     /**<br>      * 错误报告 <br>      * $errorno 错误号<br>      */<br>     private function setErrorMsg($errorno){<br>         $msg = "上传文件<font> {$this->originalFileName} </font>时出错: ";<br>         switch($errorno){<br>             case 1:<br>             case 2:<br>                 $msg .= '文件过大,无法上传';  //配置文件中的大小<br>             case 3:<br>                 $msg .= '文件只被部分上传'; break;<br>             case -1:<br>                 $msg .= '不充许的文件类型'; break;<br>             case -2:<br>                 $msg .= '文件过大,上传文件不能超过'.$this->getFileSize($this->maxsize); break;<br>             case -3: <br>                 $msg .= '上传失败'; break;<br>             case -4:<br>                 $msg .= '建立存放上传文件目录失败,请重新指定上传目录'; break;<br>             case -5:<br>                 $msg .= '必须指定上传文件的路径'; break;<br>             case -6:<br>                 $msg .= '不是上传的文件'; break;<br>             default: $msg .=  "未知错误";<br>         }<br>         return $msg.'<br>';<br>     }<br>     <br>     /**<br>      * 检查有没有指定上传路径<br>      */<br>     private function emptySavePath() {<br>         if(empty($this->savepath)) {<br>             $this->errorMessage .= $this->setErrorMsg(-5);<br>             return true;<br>         }<br>         return false;<br>     }<br>     <br>     /**<br>      * 得到扩展名<br>      * $fileName 文件名<br>      */<br>     private function getExpandedName() {<br>         $pos = strrpos($this->originalFileName, '.');<br>         return substr($this->originalFileName, $pos+1);<br>     }<br>     <br>     /**<br>      * 检查文件扩展名是够合法<br>      */<br>     private function isLegalExpandedName() {<br>         if(in_array($this->expandedName, $this->allowtype)) {<br>             return true;<br>         }<br>         $this->errorMessage .= $this->setErrorMsg(-1);<br>         <br>         return false;<br>     }<br>     <br>     /**<br>      * 检查上传的文件有没有错误<br>      * $i 第几个文件<br>      */<br>     private function hasError($i) {<br>         $errorno = $this->uploadFileArray[$i][$this->error];<br>         if(0 == $errorno) {<br>             return 0; //文件正常<br>         } else if(4 == $errorno) {<br>             return 4;  //没有上传文件<br>         }<br>         $this->errorMessage .= $this->setErrorMsg($errorno);<br>         <br>         return 99;  //文件有错误<br>     }<br>     <br>     /**<br>      * 检查文件大小<br>      * $i 第几个文件<br>      */<br>     private function isLegalSize($i) {<br>         $fileSize = $this->uploadFileArray[$i][$this->size];<br>         if($fileSize maxsize) {<br>             return true;<br>         }<br>         $this->errorMessage .= $this->setErrorMsg(-2);<br>         return false;<br>     }<br>     <br>     /**<br>      * 检查所给出的文件是否是通过HTTP POST上传的<br>      * $i 第几个文件<br>      */<br>     private function isUploadedFile($i) {<br>         $tmpName = $this->uploadFileArray[$i][$this->tmp_name];<br>         if(is_uploaded_file($tmpName)) {<br>             return true;<br>         }<br>         $this->errorMessage .= $this->setErrorMsg(-6);<br>         return false;<br>     }<br>     <br>     /**<br>      * 得到新文件名(如果用户指定不用新文件名则使用旧文件名)<br>      *<br>      */<br>     private function initNewFileName() {<br>         $str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';<br>         $chars = $this->originalFileName;  // 有后缀 .jpg<br>         if($this->israndname) {<br>             $chars = '';<br>             for($i=0; $inewfilenamelength-8; $i++) {<br>                 $chars .= substr($str, mt_rand(0, strlen($str)-1), 1);<br>             }<br>             $chars .= date('Ymd', time());<br>             $chars = $chars . '.' . $this->expandedName;<br>         } else {<br>             // 给定了使用指定的名字<br>             if('' != $this->givenfilename) {<br>                 $chars = $this->givenfilename . '.' . $this->expandedName;<br>             }<br>         }<br>        <br>         return $chars;<br>     }<br>     <br>     /**<br>      * 复制文件到指定地方<br>      * $i 第几个文件<br>      */<br>     private function copyFile($i) {<br>         $this->newFileName[$i] = $this->initNewFileName();<br>         <br>         if(is_dir($this->savepath)) {<br>             @move_uploaded_file($this->uploadFileArray[$i][$this->tmp_name], $this->savepath.$this->newFileName[$i]);<br>         } else {<br>             die('上传目录创建失败');<br>         }<br>     }<br>     <br>     /**<br>      * 检查是否有空文件<br>      */<br>     private function chkEmptyFile(& $arr) {<br>         $flag = 1;<br>         for($i = 0; $i              if(intval($arr[$i][$this->error]) == 4) {<br>                 $flag = 4;<br>                 break;<br>             }<br>         }<br>         <br>         return $flag;<br>     }<br>     <br>     /**<br>      * 初始化上传文件夹<br>      */<br>     private function initSavePath() {<br>         $this->savepath = rtrim($this->savepath, '/') . '/';<br>         !empty($this->subdirpattern) && $this->savepath = $this->savepath . date($this->subdirpattern, time()) . '/';<br>         <br>         $tmpSavePath = rtrim($this->savepath, '/');<br>         if(!is_dir($tmpSavePath)) {<br>             $dirs = explode('/', $tmpSavePath);<br>             $realDir = '';<br>             for($i = 0; $i                  if($dirs[$i] == '') continue;<br>                 if($dirs[$i] == '.') {<br>                     $realDir .= './';<br>                 } else {<br>                     $realDir = $realDir . $dirs[$i] . '/';<br>                 }<br>                 <br>                 if(!is_dir($realDir))<br>                     mkdir($realDir);<br>             }<br>         }<br>     }<br>     <br>     /**<br>      * 开始上传文件方法<br>      */<br>     private function startUpload() {<br>         for($i=0; $i<count>uploadFileArray); $i++) {<br>             if(0 === $this->hasError($i)) {<br>                 $this->originalFileName = $this->uploadFileArray[$i][$this->name];  // aa.jpg<br>                 $this->expandedName = $this->getExpandedName();<br>                 if($this->isLegalExpandedName()) {<br>                     if($this->isLegalSize($i)) {<br>                         //if($this->isUploadedFile($i)) {<br>                             $this->copyFile($i);<br>                         //}<br>                     }<br>                 }<br>             }<br>         }<br>     }<br>     <br>     /**<br>      * 上传文件 入口<br>      * $fileField input框的name属性值<br>      */<br>     public function uploadFile($fileField) {<br>         //检查上传路径<br>         if(true === $this->emptySavePath()) {<br>             return false;<br>         }<br>         <br>         if(0 !== count($_FILES)) {<br>             //重新排列上传文件<br>             $this->uploadFileArray = $this->reSortFile($_FILES[$fileField]);<br>             <br>             //开始上传文件<br>             if( !$this->ignoreemptyfile && 4 == $this->chkEmptyFile($this->uploadFileArray) ) {<br>                 die('强制全部上传模式');<br>                 <br>             } else {<br>                 $this->initSavePath();  // 初始化上传路径<br>                 $this->startUpload();<br>             }<br>         }<br>     }<br>      <br>     /**<br>      * de到错误信息 <br>      */     <br>     public function getErrorMsg() {<br>         return $this->errorMessage;<br>     }<br>     <br>     public function getUploadFileName() {<br>         foreach($this->newFileName as $key=>$val) {<br>             $this->newFileName[$key] = $this->savepath . $this->newFileName[$key];<br>         }<br>         return $this->newFileName;<br>     }<br> }<br> <br> ?></count>

附件 FileUpload.rar ( 3.89 KB 下载:205 次 )

AD:真正免费,域名+虚机+企业邮箱=0元

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn