PHP封装一个文件上传类(支持单文件多文件上传)


class Upload {
    //添加一个智能操作: 可以自动判断当前是多文件还是单文件, 来自动选择正确的方法进行处理
    public static function save($dir) {
        if (!file_exists($dir)) {
            // a/b/c 中间目录不存在,会自动创建!
            mkdir($dir, 0777, true);
        }

        //判断当前是多文件 还是 单文件上传
        //单文件上传的数组 是 二维数组, 多文件上传的数组是三维数组
        //做法: 判断是否为三维数组即可

        //reset()用于读取数组中的首个值
        $tmp = reset($_FILES);
        $tmp = reset($tmp);

        if (is_array($tmp)) {
            //是3维
            return self::saveMultiple($dir);
        } else {
            return self::saveSingle($dir);
        }
    }

    //多文件上传
    protected static function saveMultiple($dir) {
        //1.转换格式
        foreach ($_FILES as $key => $value) {
            foreach ($value as $kk => $vv) {
                foreach ($vv as $k => $v) {
                    $newArr[$k][$kk] = $v;
                }
            }
        }

        //2.循环保存
        $names = [];

        foreach ($newArr as $key => $value) {
            $filename = $value['tmp_name'];

            //随机名称: 重名 和 乱码问题
            $uniqueName = md5(microtime(true) . mt_rand(1e9, 9e9));
            //后缀名:
            $ext = pathinfo($value['name'], PATHINFO_EXTENSION);
            //拼接出名字:  ***.jpg
            $fn   = "$uniqueName.$ext";
            $dest = "files/$fn";

            $suc = move_uploaded_file($filename, $dest);
            //保存成功: 保存文件名到数组中
            if ($suc === true) {
                //索引数组新增元素
                $names[] = $fn;
            }
        }
        return $names;
    }

    //单文件上传操作
    protected static function saveSingle($dir) {
        foreach ($_FILES as $key => $value) {
            $filename = $value['tmp_name'];

            //随机名称: 重名 和 乱码问题
            $uniqueName = md5(microtime(true) . mt_rand(1e9, 9e9));
            //后缀名:
            $ext = pathinfo($value['name'], PATHINFO_EXTENSION);
            //拼接出名字:  ***.jpg
            $fn   = "$uniqueName.$ext";
            $dest = "$dir/$fn";

            $suc = move_uploaded_file($filename, $dest);
            //失败, 则返回false
            if ($suc === false) {
                return false;
            }
        }
        //如果没有失败, 就返回保存成功的文件名
        return $fn;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值