开发教程

一则按年月日存储图片上传的thinkphp5方法

对于thinphp5这一在中国流行的php框架来说,它已内置了文件上传方法。

但是!很简单。正因为其简单,所以我们通常会增加相同文件判断,七牛云、阿里云OSS等外部存储支持。

恰好在我们的呼啦企业网站管理系统中,有用到,花费了一颗烟的功夫,写就。

下面是代码,请看。

/**
     * 图片和视频上传方法
     */
    public function pic_video($config,$formFile='file'){
        $rootPath=$config['rootPath'];

        // 获取表单上传文件 例如上传了001.jpg
        $file = request()->file($formFile);
        // 验证文件大小和文件类型
        $info = $file->validate(['size'=>$config['maxSize'],'ext'=>$config['exts']]);
        //获取文件md5用以验证是否曾上传过。
        $fileMd5=$info->md5();
        $pic=db('picture')->where('md5',$fileMd5)->where('status','egt',-1)->find();

        //如果上传过,直接从数据库中拉取图片地址。
        if($pic){
            $data['path']=$pic['path'];
            $data['url']=$pic['url'];
            $this->info=$data;
            return true;
        }


        //保存到站点目录下
        $info = $info->move( $rootPath);
        if($info){
            $saveFileName=$info->getSaveName();
            $savePath=$rootPath.'/'.str_replace('\\','/',$saveFileName);
            $saveUrl='';

            //判断是否开启了外部存储。
            $picUploadDriver=config('PICTURE_UPLOAD_DRIVER');
            if((int)$picUploadDriver===1){
                //七牛云存储
                require_once APP_PATH . '/../vendor/Qiniu/autoload.php';
                // 需要填写你的 Access Key 和 Secret Key
                $accessKey = config('QINIU_ACCESS_KEY');
                $secretKey = config('QINIU_SECRET_KEY');


                // 构建鉴权对象
                $auth = new Auth($accessKey, $secretKey);

                // 要上传的空间
                $bucket = config('QINIU_BUCKET');
                $domain = config('QINIU_DOMAIN');
                $token = $auth->uploadToken($bucket);
                // 初始化 UploadManager 对象并进行文件的上传
                $uploadMgr = new UploadManager();
                // 调用 UploadManager 的 putFile 方法进行文件的上传
                list($ret, $err) =$uploadMgr->putFile($token, $savePath, $savePath);
                if ($err == null) {
                    $saveUrl=$domain.$savePath;
                }
            }
            elseif((int)$picUploadDriver===2){
                //阿里云OSS
                try{
                    $ossClient= new OssClient(config('ALIYUN_OSS_KEYID'), config('ALIYUN_OSS_KEYSECRET'), config('ALIYUN_OSS_ENDPOINT'));
                    $ossClient->uploadFile(config('ALIYUN_OSS_BUCKET'), $savePath, $savePath);
                    $saveUrl=config('ALIYUN_OSS_DOMAIN').$savePath;
                }
                catch(OssException $e) {
                    //如果出错这里返回报错信息
                    trace('上传到阿里云oss错误:'.$e->getMessage(),'error');
                }
            }


            //将文件信息保存到数据库中
            $fileSha1=$info->sha1();
            $data['path']='/'.$savePath;
            $data['url']=$saveUrl;
            $insertData['path']=$data['path'];
            $insertData['url']=$data['url'];
            $insertData['md5']=$fileMd5;
            $insertData['sha1']=$fileSha1;
            $insertData['create_time']=time();
            db('picture')->insert($insertData);
            $this->info=$data;
            return true;
        }
        else{
            $this->error="上传失败:".$file->getError();
            return false;
        }


如果你是直接拷贝过去,我赌上五个bug,你还回来看剩下的代码。

在上面的上传代码中,你也看到了,需要传递变量。这个$config便是上传文件的配置参数。它是这样的。

/* 图片上传相关配置 */
    'PICTURE_UPLOAD' => array(
        'maxSize'  => 2*1024*1024, //上传的文件大小限制
        'exts'     => 'jpg,gif,png,jpeg', //允许上传的文件后缀
        'rootPath' => 'uploads/picture', //保存根路径
    ),
    /* 视频上传相关配置 */
    'VIDEO_UPLOAD' => array(
        'maxSize'  => 500*1024*1024, //上传的文件大小限制
        'exts'     => 'mp4,ogg,webm', //允许上传的文件后缀
        'rootPath' => 'uploads/video', //保存根路径
    ),
    /* 文件上传相关配置 */
    'FILE_UPLOAD' => array(
        'maxSize'  => 500*1024*1024, //上传的文件大小限制
        'exts'     => 'jpg,gif,png,jpeg,txt,pdf,doc,docx,xls,xlsx,zip,rar,ppt,pptx', //允许上传的文件后缀
        'rootPath' => 'uploads/file', //保存根路径
    ),

还是那个如果,你使用七牛云、阿里云OSS等外部存储,也是需要配置信息。至于他的配置信息是什么?那就当做个bug,你自己找吧。