PHP Class - 文件上传

测试文件

<!DOCTYPE html>
<html>
<head>
    <title>上传测试</title>
</head>
<body>
    <form action="Upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="fm"><br/>
        <input type="submit" name="">
    </form>
</body>
</html>

类文件

<?php

$up = new Upload();
$up->uploadFile('fm');
var_dump($up->errorNumber);
var_dump($up->errorInfo);
/*
 * 文件上传
 */
class Upload
{
    // 文件上传保存路径
    protected $path = './upload/';
    // 允许后缀
    protected $allowSuffix = ['jpg', 'jpeg', 'gif', 'wbmp', 'png'];
    // 允许Mime
    protected $allowMime = ['image/jpeg', 'image/gif', 'image/wbmp', 'image/png'];
    // 允许大小2m
    protected $maxSize = 2000000;
    // 是否随机名字
    protected $isRandName = true;
    // 上传文件前缀
    protected $prefix = 'up_';

    // 错误号码和信息
    protected $errorNumber;
    protected $errorInfo;

    // 文件的信息
    protected $oldName;
    protected $suffix;
    protected $size;
    protected $mime;
    protected $tempName;

    // 文件新名字
    protected $newName;

    // 构造函数
    public function __construct($arr = [])
    {
        foreach ($arr as $key => $value) {
            $this->setOption($key, $value);
        }
    }

    // 设置成员属性
    protected function setOption($key, $value)
    {
        // 得到所有成员属性
        $keys = get_class_vars(__CLASS__);
        // 判断$key是否为成员属性
        if(in_array($key, $keys)){
            $this->$key = $value;
        }
        // if(property_exists($this, $key)) {
        //     $this->$key = $value;
        // }
    }

    // 文件上传函数 $key: html input中的name属性值
    public function uploadFile($key)
    {
        // 判断是否设置路径
        if(empty($this->path)){
            $this->setOption('errorNumber', -1);
            return false;
        }
        // 判断路径是否存在
        if(!$this->check()){
            $this->setOption('errorNumber', -2);
            return false;
        }
        // 判断$_FILES 的error是否为0
        $error = $_FILES[$key]['error'];
        if($error){
            $this->setOption('errorNumber', $error);
            return false;
        }else{
            // 提取文件信息
            $this->getFileInfo($key);
        }
        // 判断文件的大小,mime,后缀
        if(!$this->checkSize() || !$this->checkMime() || !$this->checkSuffix()){
            return false;
        }
        // 得到新名字
        $this->newName = $this->createNewName();
        // 判断是否为上传文件,并且移动上传文件
        if(is_uploaded_file($this->tmpName)){
            if(move_uploaded_file($this->tmpName, $this->path.$this->newName)){
                return $this->path.$this->newName;
            }else{
                $this->setOption('errorNumber', -7);
                return false;
            }
        }else{
            $this->setOption('errorNumber', -6);
            return false;
        }
    }

    // 创建新名字
    protected function createNewName()
    {
        if($this->isRandName){
            $name = $this->prefix.uniqid().'.'.$this->suffix;
        }else{
            $name = $this->prefix.$this->oldName;
        }
        return $name;
    }

    // 检测创建文件夹, 检测文件是否可写
    protected function check()
    {
        // 文件夹不存在或不是目录,创建
        if(!file_exists($this->path) || !is_dir($this->path)){
            return mkdir($this->path, 0777, true);
        }

        // 判断文件是否可写
        if(!is_writeable($this->path)){
            return chmod($this->path, 0777);
        }

        return true;
    }

    // 获取上传文件信息
    protected function getFileInfo($key)
    {
        $this->oldName = $_FILES[$key]['name'];
        $this->mime = $_FILES[$key]['type'];
        $this->tmpName = $_FILES[$key]['tmp_name'];
        $this->size = $_FILES[$key]['size'];
        $this->suffix = pathinfo($this->oldName)['extension'];
    }

    // 检测文件大小是否合法
    protected function checkSize()
    {
        if($this->size > $this->maxSize){
            $this->setOption('errorNumber', -3);
            return false;
        }
        return true;
    }

    // 检测文件mime是否合法
    protected function checkMime()
    {
        if(!in_array($this->mime, $this->allowMime)){
            $this->setOption('errorNumber', -4);
            return false;
        }
        return true;
    }

    // 检测文件后缀是否合法
    protected function checkSuffix()
    {
        if(!in_array($this->suffix, $this->allowSuffix)){
            $this->setOption('errorNumber', -5);
            return false;
        }
        return true;
    }

    // 返回错误代码和错误信息
    public function __get($name)
    {
        if($name == 'errorNumber'){
            return $this->errorNumber;
        }else if($name == 'errorInfo'){
            return $this->getErrorInfo();
        }
    }

    // 获得错误信息
    protected function getErrorInfo()
    {
        switch ($this->errorNumber) {
            case -1:
                $str = '文件路径未设置';
                break;
            case -2:
                $str = '文件路径不是目录或者没有权限';
                break;
            case -3:
                $str = '文件大小超过范围';
                break;
            case -4:
                $str = '文件mime类型不符合';
                break;
            case -5:
                $str = '文件后缀类型不符合';
                break;
            case -6:
                $str = '不是上传文件';
                break;
            case -7:
                $str = '文件上传失败';
                break;
            case 1:
                $str = '文件大小超过PHP设置限制';
                break;
            case 2:
                $str = '文件超出HTML设置大小';
                break;
            case 3:
                $str = '文件只有部分被上传';
                break;
            case 4:
                $str = '没有文件被上传';
                break;
            case 6:
                $str = '找不到临时文件夹';
                break;
            case 7:
                $str = '文件写入失败';
                break;
        }

        return $str;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值