首页 > 编程语言 >php本地上传文件类

php本地上传文件类

时间:2022-08-24 16:59:32浏览次数:62  
标签:files name break 本地 error array php 上传

/**
 * Class UploadFile
 * @author fengzi
 */
class UploadFile
{
    public $error = array();    //上传前的error信息
    public $info = array();     //上传过程中的错误信息
    protected $uploadType;      //标识是单文件还是多文件上传
    protected $files;        //上传的文件
    protected $path;         //上传文件的新路径
    public $maxsize = 8 * 1024 * 1024;  //设置上传文件的大小
    public $allow_type = array('gif', 'jpg', 'png', 'zip', 'rar', 'txt', 'doc', 'pdf','docx', 'jpeg', 'pptx', 'mp4', 'avi', 'mpeg', 'xls', 'xlsx'); //默认允许用户上传的文件类型
    public $save_info = array();     //上传成功后,返回一组有用信息


    function __construct($files, $path, $size=0){
        $this->path = $path;
        $this->uploadType = $this->singleOrManyFile($files);
        $this->maxsize = empty($size) ? 8 * 1024 * 1024 : $size * 1024 * 1024;

        if ( !$this->isError($files, $this->uploadType) ) {
            return $this->error;
        }

        $this->isPathExist();
    }


    //上传文件
    public function upload() {
        $num = count($this->files['name']);

        for ($i=0; $i<$num; $i++) {
            $name = $this->files['name'][$i];
            $type = $this->files['type'][$i];
            $tmp_name = $this->files['tmp_name'][$i];
            $size = $this->files['tmp_name'][$i];

            //判断上传文件有没有超过最大值
            if ( !$this->checkSize($size) ) {
                $this->setInfo($name, 'size');
                continue;
            }

            //获得随即文件名
            $newFileName = $this->proRandName($name);
            $new_path = $this->path.'/'.$newFileName;

            //判断上传类型是否正确
            $ext = trim($this->getFileExt($name));
            if ( !$this->checkFileType($ext) ) {
                $this->setInfo($name, 'ext', $ext);
                continue;
            }

            //判断文件是否是通过 HTTP POST 上传的
            if( !is_uploaded_file($tmp_name) ) {
                $this->setInfo($name, 'tmp_name');
                continue;
            }

            //上传文件
            if( !@move_uploaded_file($tmp_name, $new_path) ) {
                $this->setInfo($name, 'move_uploaded_file');
                continue;
            } else {
                //存储当前文件的有关信息,以便其它程序调用
                $this->save_info[] =  array(
                    "name" => $name,
                    "new_name" => $newFileName,
                    "ext" => $ext,
                    "mime_type" => $type,
                    "size" => $size,
                    "save_path" => $this->path,
                );
            }
        }
    }

    //获取上传成功后的信息
    public function getSaveInfo() {
        return $this->save_info;
    }

    //获取上传中的错误信息
    public function getInfo() {
        return $this->info;
    }


    //获取上传时的错误信息
    public function getError() {
        return $this->error;
    }

    //记录上传过程中的错误
    private function setInfo($name, $flag, $ext='') {
        switch ($flag) {
            case 'size':
                $info = "上传文件超过了设置的最大值";
                break;
            case 'ext':
                $str = implode(',', $this->allow_type);
                $info = "上传的文件类型{$ext}不在{$str}中";
                break;
            case 'tmp_name':
                $info = "文件不是通过 HTTP POST 上传的";
                break;
            case 'move_uploaded_file':
                $info = "上传文件失败";
                break;
        }

        $array = array(
            'filename' => $name,
            'info' => $info,
        );
        $this->info[] = $array;
    }


    //检查保存目录是否存在
    private function isPathExist() {
        if ( !file_exists($this->path) || !is_writable($this->path) ) {
            @mkdir($this->path);
            chmod($this->path, 0777);
        }
    }


    //判断是单文件还是多文件上传
    private function singleOrManyFile($files) {
        if ( is_array($files['name']) ) {
            return 'many';
        } else {
            return 'single';
        }
    }

    //判断上传文件是否有错误
    private function isError($files, $uploadType) {
        if ( $uploadType == 'single' ) {
            $this->files = array();
            $this->files['name'] = array($files['name']);
            $this->files['type'] = array($files['type']);
            $this->files['tmp_name'] = array($files['tmp_name']);
            $this->files['error'] = array($files['error']);
            $this->files['size'] = array($files['size']);
        } else {
            $this->files = $files;
        }

        $num = count($this->files['name']);
        for ($i=0; $i<$num; $i++) {
            if ( $this->files['error'][$i] > 0 ) {
                switch ($this->files['error'][$i]) {
                    case 1:
                        $this->error[] = '文件大小超过了PHP.ini中的文件限制';
                        break;
                    case 2:
                        $this->error[] = '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
                        break;
                    case 3:
                        $this->error[] = '文件部分被上传';
                        break;
                    case 4:
                        $this->error[] = '没有文件被上传';
                        break;
                    case 5:
                        $this->error[] = '服务器临时文件夹丢失';
                        break;
                    case 6:
                        $this->error[] = '文件写入到临时文件夹出错';
                        break;
                    case 7:
                        $this->error[] = '文件写入失败';
                        break;
                    case -1:
                        $this->error[] = '末充许的类型';
                        break;
                    case -2:
                        $this->error[] = '文件过大,上传的文件不能超过'.$this->maxsize.'个字节';
                        break;
                    case -3:
                        $this->error[] = '上传失败';
                        break;
                    case -4:
                        $this->error[] = '建立存放上传文件目录失败,请重新指定上传目录';
                        break;
                    case -5:
                        $this->error[] = '必须指定上传文件的路径';
                        break;
                }
            } else if( $this->files['size'][$i] > $this->maxsize) {
                $this->error[] = '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
            }
        }

        if ( !empty($this->error) ) {
            return false;
        } else {
            return true;
        }
    }


    //判断上传文件是否为允许类型
    private function checkFileType($ext) {
        if ( in_array($ext, $this->allow_type) ) {
            return true;
        } else {
            return false;
        }
    }

    //设置随机文件名
    private function proRandName($name) {
        $fileName = date('YmdHis')."_".uniqid().mt_rand(100000,999999);   //获取随机文件名
        return $fileName.'.'.$this->getFileExt($name);    //返回文件名加原扩展名
    }

    //获取文件后缀
    private function getFileExt($name) {
        $point = strripos(strtolower($name), '.');
        $ext = substr($name, $point+1);
        return $ext;
    }

    //检测用户提交文件大小是否合法
    private function checkSize($size) {
        if ($size > $this->maxsize) {
            return false;
        } else {
            return true;
        }
    }
}    

 

标签:files,name,break,本地,error,array,php,上传
From: https://www.cnblogs.com/mklblog/p/16620707.html

相关文章

  • mysql php js 经纬度 转换 查询
    坐标系介绍地球坐标(WGS84)WGS-84:是国际标准,GPS坐标(GoogleEarth使用、或者GPS模块)国际标准,从专业GPS设备中取出的数据的坐标系国际地图提供商使用的坐标系火星坐......
  • HuGo博客的搭建以及上传到GitHub
    按照步骤来我用的是windows操作系统1.下载Githttps://git-scm.com/2.下载GuGohttps://github.com/gohugoio/hugo/releases往下拖,选择对应的系统下载3.配置HuGo的......
  • HuGo博客的二次上传
    第二次甚至之后的提交1.重新生成下public文件夹,上面一章的第五步文件夹目录下执行cmd命令:hugo--theme=m10c--baseUrl="https://hpf189.github.io/"--buildDrafts2......
  • 在线编辑器粘贴图片自动上传到服务器(Java版)
    ​ tinymce是很优秀的一款富文本编辑器,可以去官网下载。https://www.tiny.cloud这里分享的是它官网的一个收费插件powerpaste的旧版本源码,但也不影响功能使用。umedit......
  • PHP检测一个字符串中是否包含另外一个字符或字符串
    编写程序的时候,经常要处理字符串,最基本就是字符串的查找,您可能需要检查字符串是否包含特定的字符或子字符串,因为您可能必须对该子字符串或字符执行某些操作。我们将使用......
  • PHP删除数组元素的三种常用方法
    在PHP网络编程中,你可能需要删除数组中的一些元素,在本文章中,我们将演示并描述php如何删除数组元素。文章一共列举了三种方法来实现这一功能:phpunset()函数phparray_sp......
  • PHP array_chunk()函数
    array_chunk()函数是PHP中的内置函数,用于根据传递给函数的参数将数组拆分为给定大小的部分或块。最后一个块可能包含的元素少于块的所需大小。语法:arrayarray_chunk($ar......
  • PHP多维数组按照某个字段进行排序
    作为开发人员,您可能会遇到这种情况,即数据库中有一个按特定顺序获取的数据列表,但您希望在前端显示这些项目时安装期中某一个字段进行排序。比如数组:$mylist=array(arra......
  • PHP+AJAX实现异步上传文件
    文件上传功能是动态Web应用程序的常用功能。通常,php采用提交表单并刷新页面的方法上传文件。但是,如果您想提供更好的用户体验,则可以使用jQuery和Ajax来上传文件而无需刷新......
  • maven项目不上传某些jar文件到私服
    maven项目,在顶层目录执行deploy命令时,默认会将所有的jar包全部上传到私服,实际上我们只需要上传接口jar文件即可。解决方案:在不需要上传的项目pom.xml文件中,加上如下即可。......