<?php


namespace app\common\lib\files;

use think\Exception;
use think\exception\ValidateException;

class upload
{
    private $domain;
    protected $name;
    protected $type;
    protected $module;
    protected $image;

    public function __construct($name = '',$type = 'image',$image = [])
    {
        $this->name = $name;
        $this->type = $this->checkUpload($type);
        $this->module = request()->app_name();
        $this->image = $image;
        $this->domain = Request()->domain();
    }
    protected $config = [
        'image' => [
            'validate' => [
                'size' => 10*1024*1024,
                'ext'  => 'jpg,png,gif,jpeg',
            ],
            'path'     =>  '/images',
        ],
        'audio' => [
            'validate' => [
                'size' => 100*1024*1024,
                'ext'  => 'mp3,wav,cd,ogg,wma,asf,rm,real,ape,midi',
            ],
            'path'     =>  '/audios',
        ],
        'video' => [
            'validate' => [
                'size' => 100*1024*1024,
                'ext'  => 'mp4,avi,rmvb,rm,mpg,mpeg,wmv,mkv,flv',
            ],
            'path'     =>  '/videos',
        ],
        'file' => [
            'validate' => [
                'size' => 5*1024*1024,
                'ext'  => 'doc,docx,xls,xlsx,pdf,ppt,txt,rar,zip,pem,p12',
            ],
            'path'     =>  '/files',
        ],
    ];

    private function checkUpload($type){
        try{
            if(empty($_FILES) || empty($_FILES[$this->name])) throw new Exception("未上传文件!");
            if(!in_array($type,array_keys($this->config))) throw new Exception("文件类型不存在!");
            return $type;
        }catch (Exception $e){
            return \app\common\controller\Base::show(100,$e->getMessage());
        }

    }


    public function upfile($infoSwitch = false){
        $file = request()->file($this->name);
        try{
            if($file == null) throw new ValidateException("the file cannot be empty");
            validate(['file' => self::validateFile()])->check(['file' => $file]);
            $savename = \think\facade\Filesystem::disk('public')->putFile( $this->module.$this->config[$this->type]['path'], $file);
            if($infoSwitch){
                return self::getFileInfo($file,$savename);
            }
            return $savename;
        }catch (\think\exception\ValidateException $e){
            return \app\common\controller\Base::show(100,self::languageChange($e->getMessage()));
        }
    }

    private function validateFile(){
        if(empty($this->image)){
            $validataType = [
                'fileSize' => $this->config[$this->type]['validate']['size'],
                'fileExt'  => $this->config[$this->type]['validate']['ext'],
            ];
        }else{
            if(is_array($this->image)) throw new ValidateException("");
            $validataType = [
                'fileSize' => $this->config[$this->type]['validate']['size'],
                'fileExt'  => $this->config[$this->type]['validate']['ext'],
                'image'    => $this->image //示例值 [200,200]
            ];
        }
        return $validataType;
    }

    private function languageChange($msg){
        $data = [
            'the file cannot be empty'                   => '文件不能为空!',
            'unknown upload error'                       => '未知上传错误!',
            'file write error'                           => '文件写入失败!',
            'upload temp dir not found'                  => '找不到临时文件夹!',
            'no file to uploaded'                        => '没有文件被上传!',
            'only the portion of file is uploaded'       => '文件只有部分被上传!',
            'upload File size exceeds the maximum value' => '上传文件大小超过了最大值!',
            'upload write error'                         => '文件上传保存错误!',
        ];
        return $data[$msg] ?? $msg;
    }

    private function getFileInfo($file,$savename){
        $info = [
            'path' => config('filesystem.disks.public.url').'/'.str_replace('\\','/',$savename),
            'url'  => $this->domain.config('filesystem.disks.public.url').'/'.str_replace('\\','/',$savename),
            'size' => $file->getSize(),
            'name' => $file->getOriginalName(),
            'mime' => $file->getMime(),
            'ext'  => $file->extension()
        ];
        return $info;
    }


}

使用方法 :

    $instanceUpload = new upload($fileName,$fileType);
    $info = $instanceUpload->upfile(true);
最后修改:2022 年 05 月 05 日 11 : 31 PM
对您有帮助的话,请赏包辣条吧 ^~^