zoukankan      html  css  js  c++  java
  • 单文件上传与多文件上传的文件上传类

    1、单文件上传

    form.html

    <form action="upload.php" method="post" enctype="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="100000000">
        <input type="file" name="spic"> <br>
    
        <input type="submit" name="sub" value="upload file"><br>
    
    </form>

    upload.php

    require "FileUpload.class.php";
    
        $up=new FileUpload(array('isRandName'=>true,'allowType'=>array('jpg', 'doc', 'php', 'gif'),'FilePath'=>'./uploads/', 'MAXSIZE'=>200000000));
    
        echo '<pre>';
    
        if($up->uploadFile('spic')){
            print_r($up->getNewFileName());
        }else{
            print_r($up->getErrorMsg());    
        }
    
        echo '</pre>';

    FileUpload.class.php

    class FileUpload {
            private $filepath;     //指定上传文件保存的路径
            private $allowtype=array('gif', 'jpg', 'png', 'jpeg');  //充许上传文件的类型
            private $maxsize=1000000;  //允上传文件的最大长度 1M
            private $israndname=true;  //是否随机重命名, true false不随机,使用原文件名
            private $originName;   //源文件名称
            private $tmpFileName;   //临时文件名
            private $fileType;  //文件类型
            private $fileSize;  //文件大小
            private $newFileName; //新文件名
            private $errorNum=0;  //错误号
            private $errorMess=""; //用来提供错误报告
    
    
    
            //用于对上传文件初使化
            //1. 指定上传路径, 2,充许的类型, 3,限制大小, 4,是否使用随机文件名称
            //让用户可以不用按位置传参数,后面参数给值不用将前几个参数也提供值
            function __construct($options=array()){
                foreach($options as $key=>$val){
                    $key=strtolower($key);
                    //查看用户参数中数组的下标是否和成员属性名相同
                    if(!in_array($key,get_class_vars(get_class($this)))){
                        continue;
                    }
    
                    $this->setOption($key, $val);
                }
             
            
            }
        
    
    
            private function getError(){
                $str="上传文件<font color='red'>{$this->originName}</font>时出错:";
    
                switch($this->errorNum){
                    case 4: $str .= "没有文件被上传"; break;
                    case 3: $str .= "文件只被部分上传"; break;
                    case 2: $str .= "上传文件超过了HTML表单中MAX_FILE_SIZE选项指定的值"; break;
                    case 1: $str .= "上传文件超过了php.ini 中upload_max_filesize选项的值"; break;
                    case -1: $str .= "末充许的类型"; break;
                    case -2: $str .= "文件过大,上传文件不能超过{$this->maxSize}个字节"; break;
                    case -3: $str .= "上传失败"; break;
                    case -4: $str .= "建立存放上传文件目录失败,请重新指定上传目录"; break;
                    case -5: $str .= "必须指定上传文件的路径"; break;
    
                    default: $str .=  "末知错误";
                }
    
                return $str.'<br>';
            }
        
            //用来检查文件上传路径
            private function checkFilePath(){
                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;
            }
            //用来检查文件上传的大小
            private function checkFileSize() {
                if($this->fileSize > $this->maxsize){
                    $this->setOPtion('errorNum', '-2');
                    return false;
                }else{
                    return true;
                }
            }
    
            //用于检查文件上传类型
            private function checkFileType() {
                if(in_array(strtolower($this->fileType), $this->allowtype)) {
                    return true;
                }else{
                    $this->setOption('errorNum', -1);
                    return false;
                }
            }
            //设置上传后的文件名称
            private function setNewFileName(){
                if($this->israndname){
                    $this->setOption('newFileName', $this->proRandName());
                } else {
                    $this->setOption('newFileName', $this->originName);
                }
            }
    
    
    
            //设置随机文件名称
            private function proRandName(){
                $fileName=date("YmdHis").rand(100,999);
                return $fileName.'.'.$this->fileType;
            }
        
            private function setOption($key, $val){
                $this->$key=$val;
            }
            //用来上传一个文件
            function uploadFile($fileField){
                $return=true;
                //检查文件上传路径
                if(!$this->checkFilePath()){
                    $this->errorMess=$this->getError();
                    return false;
                }
    
                
                $name=$_FILES[$fileField]['name'];
                $tmp_name=$_FILES[$fileField]['tmp_name'];
                $size=$_FILES[$fileField]['size'];
                $error=$_FILES[$fileField]['error'];
    
                    
                        if($this->setFiles($name, $tmp_name, $size, $error)){
                            if($this->checkFileSize() && $this->checkFileType()){
                                $this->setNewFileName();
    
                                if($this->copyFile()){
                                    return true;
                                }else{
                                    $return=false;
                                }
                                    
                            }else{
                                $return=false;
                            }    
                        }else{
                            $return=false;
                        }
                        
                        
    
                        if(!$return)
                            $this->errorMess=$this->getError();
    
    
                        return $return;
                
            }
    
            private function copyFile(){
                if(!$this->errorNum){
                    $filepath=rtrim($this->filepath, '/').'/';
                    $filepath.=$this->newFileName;
    
                    if(@move_uploaded_file($this->tmpFileName, $filepath))    {
                        return true;
                    }else{
                        $this->setOption('errorNum', -3);
                        return false;
                    }
                        
                }else{
                    return false;
                }
            }
    
            //设置和$_FILES有关的内容
            private function setFiles($name="", $tmp_name='', $size=0, $error=0){
            
                $this->setOption('errorNum', $error);
                    
                if($error){
                    return false;
                }
    
                $this->setOption('originName', $name);
                $this->setOption('tmpFileName', $tmp_name);
                $arrStr=explode('.', $name); 
                $this->setOption('fileType', strtolower($arrStr[count($arrStr)-1]));
                $this->setOption('fileSize', $size);    
    
                return true;
            }    
    
            //用于获取上传后文件的文件名
            function getNewFileName(){
                return $this->newFileName;
            }
            //上传如果失败,则调用这个方法,就可以查看错误报告
            function getErrorMsg() {
                return $this->errorMess;
            }
        }

    2、多文件上传

    form.html

    <form action="upload.php" method="post" enctype="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="100000000">
        <input type="file" name="spic[]"> <br>
        <input type="file" name="spic[]"> <br>
        <input type="file" name="spic[]"> <br>
        <input type="file" name="spic[]"> <br>
    
        <input type="submit" name="sub" value="upload file"><br>
    
    </form>

    upload.php

    require "FileUpload.class.php";
    
        $up=new FileUpload(array('isRandName'=>true,'allowType'=>array('jpg', 'doc', 'php', 'gif'),'FilePath'=>'./uploads/', 'MAXSIZE'=>200000000));
    
        echo '<pre>';
    
        if($up->uploadFile('spic')){
            print_r($up->getNewFileName());
        }else{
            print_r($up->getErrorMsg());    
        }
    
        echo '</pre>';

    FileUpload.class.php

    class FileUpload {
            private $filepath;     //指定上传文件保存的路径
            private $allowtype=array('gif', 'jpg', 'png', 'jpeg');  //充许上传文件的类型
            private $maxsize=1000000;  //允上传文件的最大长度 1M
            private $israndname=true;  //是否随机重命名, true false不随机,使用原文件名
            private $originName;   //源文件名称
            private $tmpFileName;   //临时文件名
            private $fileType;  //文件类型
            private $fileSize;  //文件大小
            private $newFileName; //新文件名
            private $errorNum=0;  //错误号
            private $errorMess=""; //用来提供错误报告
    
    
    
            //用于对上传文件初使化
            //1. 指定上传路径, 2,充许的类型, 3,限制大小, 4,是否使用随机文件名称
            //让用户可以不用按位置传参数,后面参数给值不用将前几个参数也提供值
            function __construct($options=array()){
                foreach($options as $key=>$val){
                    $key=strtolower($key);
                    //查看用户参数中数组的下标是否和成员属性名相同
                    if(!in_array($key,get_class_vars(get_class($this)))){
                        continue;
                    }
    
                    $this->setOption($key, $val);
                }
             
            
            }
        
    
    
            private function getError(){
                $str="上传文件<font color='red'>{$this->originName}</font>时出错:";
    
                switch($this->errorNum){
                    case 4: $str .= "没有文件被上传"; break;
                    case 3: $str .= "文件只被部分上传"; break;
                    case 2: $str .= "上传文件超过了HTML表单中MAX_FILE_SIZE选项指定的值"; break;
                    case 1: $str .= "上传文件超过了php.ini 中upload_max_filesize选项的值"; break;
                    case -1: $str .= "末充许的类型"; break;
                    case -2: $str .= "文件过大,上传文件不能超过{$this->maxSize}个字节"; break;
                    case -3: $str .= "上传失败"; break;
                    case -4: $str .= "建立存放上传文件目录失败,请重新指定上传目录"; break;
                    case -5: $str .= "必须指定上传文件的路径"; break;
    
                    default: $str .=  "末知错误";
                }
    
                return $str.'<br>';
            }
        
            //用来检查文件上传路径
            private function checkFilePath(){
                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;
            }
            //用来检查文件上传的大小
            private function checkFileSize() {
                if($this->fileSize > $this->maxsize){
                    $this->setOPtion('errorNum', '-2');
                    return false;
                }else{
                    return true;
                }
            }
    
            //用于检查文件上传类型
            private function checkFileType() {
                if(in_array(strtolower($this->fileType), $this->allowtype)) {
                    return true;
                }else{
                    $this->setOption('errorNum', -1);
                    return false;
                }
            }
            //设置上传后的文件名称
            private function setNewFileName(){
                if($this->israndname){
                    $this->setOption('newFileName', $this->proRandName());
                } else {
                    $this->setOption('newFileName', $this->originName);
                }
            }
    
    
    
            //设置随机文件名称
            private function proRandName(){
                $fileName=date("YmdHis").rand(100,999);
                return $fileName.'.'.$this->fileType;
            }
        
            private function setOption($key, $val){
                $this->$key=$val;
            }
            //用来上传一个文件
            function uploadFile($fileField){
                $return=true;
                //检查文件上传路径
                if(!$this->checkFilePath()){
                    $this->errorMess=$this->getError();
                    return false;
                }
    
                
                $name=$_FILES[$fileField]['name'];
                $tmp_name=$_FILES[$fileField]['tmp_name'];
                $size=$_FILES[$fileField]['size'];
                $error=$_FILES[$fileField]['error'];
    
                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{
                            $error[]=$this->getError();
                            $return=false;
                        }
    
                        if(!$return)
                            $this->setFiles();
                    }
    
                    if($return){
                        $fileNames=array();
    
                        for($i=0; $i<count($name); $i++){
                            if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
                                $this->setNewFileName();
                                if(!$this->copyFile()){
                                    $errors=$this->getError();
                                    $return=false;
                                }else{
                                    $fileNames[]=$this->newFileName;
                                }
                            }
                        }
    
                        $this->newFileName=$fileNames;
                    }
    
                    $this->errorMess=$errors;
                    return $return;
                } else {
                    
                        if($this->setFiles($name, $tmp_name, $size, $error)){
                            if($this->checkFileSize() && $this->checkFileType()){
                                $this->setNewFileName();
    
                                if($this->copyFile()){
                                    return true;
                                }else{
                                    $return=false;
                                }
                                    
                            }else{
                                $return=false;
                            }    
                        }else{
                            $return=false;
                        }
                        
                        
    
                        if(!$return)
                            $this->errorMess=$this->getError();
    
    
                        return $return;
                }            
            }
    
            private function copyFile(){
                if(!$this->errorNum){
                    $filepath=rtrim($this->filepath, '/').'/';
                    $filepath.=$this->newFileName;
    
                    if(@move_uploaded_file($this->tmpFileName, $filepath))    {
                        return true;
                    }else{
                        $this->setOption('errorNum', -3);
                        return false;
                    }
                        
                }else{
                    return false;
                }
            }
    
            //设置和$_FILES有关的内容
            private function setFiles($name="", $tmp_name='', $size=0, $error=0){
            
                $this->setOption('errorNum', $error);
                    
                if($error){
                    return false;
                }
    
                $this->setOption('originName', $name);
                $this->setOption('tmpFileName', $tmp_name);
                $arrStr=explode('.', $name); 
                $this->setOption('fileType', strtolower($arrStr[count($arrStr)-1]));
                $this->setOption('fileSize', $size);    
    
                return true;
            }    
    
            //用于获取上传后文件的文件名
            function getNewFileName(){
                return $this->newFileName;
            }
            //上传如果失败,则调用这个方法,就可以查看错误报告
            function getErrorMsg() {
                return $this->errorMess;
            }
        }
    If the copyright belongs to the longfei, please indicate the source!!!
  • 相关阅读:
    poj3277 City Horizon
    60.左值右值以及类型判断
    59.C++与正则表达式
    57.C++处理转义字符
    56.lambda表达式与绑定以及伪函数和绑定
    55.函数模板指针匹配(模板自动匹配*多的)
    54.函数模板默认参数
    53.伪函数与函数绑定器
    52.模板的重载
    51.模板与引用
  • 原文地址:https://www.cnblogs.com/longfeiPHP/p/4713210.html
Copyright © 2011-2022 走看看