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
  • 相关阅读:
    【磁盘/文件系统】第五篇:CentOS7.x__btrfs文件系统详解
    【python】-- IO多路复用(select、poll、epoll)介绍及实现
    【python】-- 事件驱动介绍、阻塞IO, 非阻塞IO, 同步IO,异步IO介绍
    【python】-- 协程介绍及基本示例、协程遇到IO操作自动切换、协程(gevent)并发爬网页
    【python】-- 多进程的基本语法 、进程间数据交互与共享、进程锁和进程池的使用
    【python】-- 队列(Queue)、生产者消费者模型
    【python】-- 信号量(Semaphore)、event(红绿灯例子)
    【python】-- GIL锁、线程锁(互斥锁)、递归锁(RLock)
    【python】-- 继承式多线程、守护线程
    【python】-- 进程与线程
  • 原文地址:https://www.cnblogs.com/chuanzi/p/10413495.html
Copyright © 2011-2022 走看看