对于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,你自己找吧。