文件上传 (本地 + 七牛云)

作者:yiqiu,最后更新时间:2020-03-24 11:33,访问:344

原文:http://www.upwqy.com/details/244.html




下载七牛云demo 文档 放到如 vender 目录下 

https://developer.qiniu.com/kodo/sdk/1241/php


image.png


<?php

namespace app\common\service;

use app\lib\exception\ParameterException;
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
use think\Db;

require  '../vendor/qiniu/php-sdk/autoload.php';
class Upload
{
   private $type ;
   public function __construct()
   {
       $this->type =   $type = config('upload.type');

   }


   /**
    * 上传单个文件
    * @param $userId
    * @param $file
    * @param  string $fileType  文件类型  获取对应的配置
    * @return array
    * @throws ParameterException
    */
   public function one($userId,$file,$fileType){
       $status = [
           'status'=>false,
           'msg'=>'',
           'data'=>[]
       ];

       $config = config('upload')[$fileType]['config'];
       $dir = config('upload')[$fileType]['dir'];


       $info     = $file->validate($config)->move(ROOT_PATH . 'public' . DS . 'upload/'.$dir);

       if(!$info){
           $status['msg'] = $file->getError();
           return $status;
       }

       if($this->type == 'local'){
           //本地上传
          $res =  $this->localUpload($userId,$info,$dir);
       }else if($this->type == 'qiniu'){
           $res =  $this->qiniu($userId,$info,$dir);
       }


       $status['status'] = true;
       $status['data'] = $res;
       return $status;
   }


   //本地上传
   private  function localUpload($userId,$info,$dir){

       $fileMd5  = $info->md5();
       $fileSha1 = $info->sha1();
       $findFile = Db::name("asset")->where('file_md5', $fileMd5)->where('file_sha1', $fileSha1)->find();

       if (!empty($findFile)) {
           $data  = [
               'db_src'=>$findFile['file_path'],
               'src'=>get_image_preview($findFile['file_path'])
           ];
           return $data;
       }

       $info = $info->move(ROOT_PATH . 'public' . DS . 'upload/'.$dir);


       $saveName     = str_replace('\\','/',$dir.'/'.$info->getSaveName());


       $originalName = $info->getInfo('name');//name,type,size
       $fileSize     = $info->getInfo('size');
       $suffix       = $info->getExtension();

       $fileKey = $fileMd5 . md5($fileSha1);

       Db::name('asset')->insert([
           'user_id'     => $userId,
           'file_key'    => $fileKey,
           'filename'    => $originalName,
           'file_size'   => $fileSize,
           'file_path'   => $saveName,
           'file_md5'    => $fileMd5,
           'file_sha1'   => $fileSha1,
           'create_time' => time(),
           'suffix'      => $suffix
       ]);
       $data = [
           'db_src'=>$saveName,
           'src'=>get_image_preview($saveName)
       ];
       return $data;
   }

   //七牛云上传
   private function qiniu($userId,$info,$dir){
       $accessKey = config('upload.qiniu')['accessKey'];
       $secretKey = config('upload.qiniu')['secretKey'];
       $bucket = config('upload.qiniu')['bucket'];

       $saveName     = str_replace('\\','/',$dir.'/'.$info->getSaveName());

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

       // 生成上传 Token
       $token = $auth->uploadToken($bucket);
       // 要上传文件的本地路径
       $path = './upload/'.$saveName;
       // 上传到七牛后保存的文件名
       $key = 'upload/'.$saveName;

       // 初始化 UploadManager 对象并进行文件的上传。
       $uploadMgr = new UploadManager();
       // 调用 UploadManager putFile 方法进行文件的上传。
       list($ret, $err) = $uploadMgr->putFile($token, $key, $path);

       if ($err !== null) {
           throw new ParameterException($err);
       } else {
           @unlink($path);
           $data = [
               'db_src'=>$saveName,
               'src'=>get_image_preview($saveName)
           ];
           return $data;
       }
   }
}




/**
* 图片视图转化
* @param $file
* @param bool $isLocal  true 本地 false 云存储
* @return string
*/
function get_image_preview($file,$isLocal = false){

   if($isLocal){
       $host = get_domain().'/';

   }else{
       $host = config('upload.static_host');//  http://www.upwqy.com/
   }

   if (empty($file)) {
       return '';
   }

   if (strpos($file, "http") === 0) {
       return $file;
   } else if (strpos($file, "https") === 0) {
       return $file;
   } else if (strpos($file, "/") === 0) {

       return $host. 'upload/'.$file;
   }else{

       return $host . 'upload/'. $file;
   }
}


上一篇: 微信公众号 接口配置信息 签名校验
下一篇: 微信小程序码生成