码迷,mamicode.com
首页 > Web开发 > 详细

PHP多文件上传类

时间:2015-08-13 11:57:58      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

<?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 } ?>

PHP多文件上传类

标签:

原文地址:http://www.cnblogs.com/qhorse/p/4726348.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!