zoukankan      html  css  js  c++  java
  • PHP封装文件上传类

    1、编写文件上传类文件

    FileUploader.php:

    <?php
    
    //文件上传
    namespace vendor;
    
    class FileUploader{
        //设定属性:保存允许上传的MIME类型
        private static $types = array('image/jpg', 'image/jpeg', 'image/pjpeg');
        //修改允许上传类型
        public static function setTypes($types = array()){
            //判定是否为空
            if (!empty($types)) self::$types = $types;
        }
        public static $error;    //记录单文件上传过程中出现的错误信息
        public static $errors;   //记录多文件上传过程中出现的错误信息
        public static $files;    //记录多文件上传成功后文件名对应信息
    
        /**
         * @desc 单文件上传
         * @param string $file,上传文件信息数组
         * @param string $path,上传路径
         * @param int $max = 2M,最大上传大小
         * @return bool|string,成功返回文件名,失败返回false
         */
        public static function uploadOne($file, $path, $max = 2000000){
            //判定文件有效性
            if (!isset($file['error']) || count($file) != 5) {
                self::$error = '错误的上传文件!';
                return false;
            }
            //路径判定
            if (!is_dir($path)) {
                self::$error = '存储路径不存在!';
                return false;
            }
            //判定文件是否正确上传
            switch ($file['error']) {
                case 1:
                case 2:
                    self::$error = '文件超过服务器允许大小!';
                    return false;
                case 3:
                    self::$error = '文件只有部分被上传!';
                    return false;
                case 4:
                    self::$error = '没有选中要上传的文件!';
                    return false;
                case 6:
                case 7:
                    self::$error = '服务器错误!';
                    return false;
            }
            //判定文件类型
            if (!in_array($file['type'], self::$types)) {
                self::$error = '当前上传的文件类型不允许!';
                return false;
            }
            //判定业务大小
            if ($file['size'] > $max) {
                self::$error = '当前上传的文件超过允许的大小!当前允许的大小是:' . (string)($max / 1000000) . 'M';
                return false;
            }
            //获取随机名字
            $filename = self::getRandomName($file['name']);
            //移动上传的临时文件到指定目录
            if (move_uploaded_file($file['tmp_name'], $path . '/' . $filename)) {
                //成功
                return $filename;
            } else {
                //失败
                self::$error = '文件移动失败!';
                return false;
            }
        }
        /**
         * @desc 多文件上传
         * @param array $files,上传文件信息二维数组
         * @param string $path,上传路径
         * @param int $max = 2M,最大上传大小
         * @return bool 是否全部上传成功
         */
        public static function uploadAll($files, $path, $max = 2000000){
            for($i = 0, $len = count($files['name']); $i < $len; $i++){
                $file = array(
                    'name'        =>$files['name'][$i],
                    'type'        =>$files['type'][$i],
                    'tmp_name'    =>$files['tmp_name'][$i],
                    'error'        =>$files['error'][$i],
                    'size'        =>$files['size'][$i]
                );
                $res = self::uploadOne($file, $path, $max);
                if(!$res){
                    //错误处理
                    $error = self::$error;
                    self::$errors[] = "文件:{$file['name']}上传失败:{$error}!<br>";
                }else{
                    self::$files[] = $file['name']. '=>'. $res;
                }
            }
            if(!empty(self::$errors)){
                //错误处理
                //var_dump(self::$errors);
                return false;
            }else{
                return true;
            }
        }
    
        /**
         * @desc 获取随机文件名
         * @param string $filename,文件原名
         * @param string $prefix,前缀
         * @return string,返回新文件名
         */
        public static function getRandomName($filename, $prefix = 'image'){
            //取出源文件后缀
            $ext = strrchr($filename, '.');
            //构建新名字
            $new_name = $prefix . date('YmdHis');
            //增加随机字符(6位大写字母)
            for ($i = 0; $i < 6; $i++) {
                $new_name .= chr(mt_rand(65, 90));
            }
            //返回最终结果
            return $new_name . $ext;
        }
    }

    2、测试

    注意:以下测试文件都和类文件放在同一文件夹,且该文件需要有一个upload子文件夹

    测试表单index.html:

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>文件上传</title>
    </head>
    <body>
    单文件上传表单
    <form action="upload.php"  method="post" enctype="multipart/form-data">
    <input type="file" name="file"><br>
    <input type="submit"><br>
    </form>
    <br>
    多文件上传表单
    <form action="uploadall.php" method="post" enctype="multipart/form-data">
        <input name="file[]" type="file"><br>
        <input name="file[]" type="file"><br>
        <input name="file[]" type="file"><br>
        <input type="submit"/><br>
    </form> 
    </body>
    </html>

    单文件上传表单处理文件upload.php:

    <?php
    include 'FileUploader.php';
    
    $file = $_FILES['file'];
    
    vendorFileUploader::setTypes(array('image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png'));
    $res = vendorFileUploader::uploadOne($file, 'upload');
    if($res) echo "文件上传成功,更名为{$res}<br>";
    else{
        $error = vendorFileUploader::$error;
        echo "文件上传失败,error:{$error}!<br>";
    }

    多文件上传表单处理文件uploadall.php:

    <?php
    include 'FileUploader.php';
    use vendorFileUploader;
    
    $files = $_FILES['file'];
    
    FileUploader::setTypes(array('image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png'));
    $res = FileUploader::uploadAll($files, 'upload', 2000000);
    if($res){
        echo '文件上传成功,文件重命名信息如下:<br>';
        foreach(FileUploader::$files as $file){
            echo $file. '<br>';
        }
    }else{
        echo '文件没有全部上传成功,错误信息如下:<br>';
        foreach(FileUploader::$errors as $error){
            echo $error. '<br>';
        }
    }
    FileUploader
  • 相关阅读:
    React生命周期, 兄弟组件之间通信
    React组件式编程Demo-用户的增删改查
    React之this.refs, 实现数据双向绑定
    CCF CSP 201812-4 数据中心
    CCF CSP 201812-4 数据中心
    PAT 顶级 1020 Delete At Most Two Characters (35 分)
    PAT 顶级 1020 Delete At Most Two Characters (35 分)
    Codeforces 1245C Constanze's Machine
    Codeforces 1245C Constanze's Machine
    CCF CSP 201712-4 行车路线
  • 原文地址:https://www.cnblogs.com/chuanzi/p/10413495.html
Copyright © 2011-2022 走看看