老莫的笔记本  
  
请选择 进入手机版 | 继续访问电脑版
查看: 1255|回复: 0

TP5 使用 gmars\qiniu 上传多图时 【七牛的使用问题】

[复制链接]

662

主题

878

帖子

5113

积分

超级版主

Rank: 8Rank: 8

积分
5113
发表于 2019-3-8 14:41:34 | 显示全部楼层 |阅读模式
胖子所遇到的问题:
    也不是哪个奇葩的网站, 介绍我用 gmars/qiniu   的。 说是和tp5搭。【以后别用了 老老实实用七牛官方的SDK】

    当时的参考文献: 参考文献:https://www.cnblogs.com/adobe-lin/p/7699638.html
                                参考文献:https://blog.csdn.net/z1040657944/article/details/79163176


    过了一段时间,我发现个问题:  多图上传的时候 就 TM 把第一张玩命的传。 别的都不传, 【问题本质 就在gmars/qiniu】  ,这里的upload  其实接收到的是所有文件,而不是一个文件。   但是上传只上传第一个。  所以  我直接改掉了 这个文件中的upload 方法,
  1. /**
  2.      * @param string $saveName
  3.      * @param string $bucket
  4.      * @param file  $files
  5.      * @return mixed
  6.      * @throws Exception
  7.      * @throws \Exception
  8.      * 单文件上传,如果添加多个文件则只上传第一个 [这个目前被我改掉了,多文件时候 则传入 think的file对象,循环调用]
  9.      */
  10.     public function upload($saveName = '', $bucket = '',$files)
  11.     {
  12.         // 获取七牛的token
  13.         $token = $this->_getUploadToken($bucket);
  14.         // 在这里接收到的是文件数组
  15.         if (empty($files)) {
  16.             throw new Exception('没有文件被上传', 10002);
  17.         }
  18.         // 返回数组的所有值(非键名)
  19.         // ------老莫修改的值.s
  20.         $values = $files->getInfo();
  21.         // -------老莫.end
  22.         // 循环获取文件数
  23.         $uploadManager = new UploadManager();
  24.         if (empty($saveName)) {
  25.             
  26.             $saveName = hash_file('sha1', $values['tmp_name']).time();
  27.         }
  28.         // 把字符串打散为数组 [其实是为了拿文件名后缀]
  29.         $infoArr = explode('.', $values['name']);
  30.         // 然后 拿到这个文件名后缀
  31.         $extension = array_pop($infoArr);
  32.         // 拼出文件名
  33.         $fileInfo = $saveName . '.' . $extension;
  34.      
  35.         // 在这个位置更改 上传为 数组循环上传即可
  36.         list($ret, $err) = $uploadManager->putFile($token, $saveName, $values['tmp_name']);
  37.         if ($err !== null) {
  38.             throw new Exception('上传出错'.serialize($err));
  39.         }
  40.         return $ret['key'];
  41.     }
复制代码


这个 返回的 是成功存储后的文件名;


然后 怼第二个思路, 由于是循环, 所以文件上传 带上个 key 在数组中, 最后好提取 , 那么 控制器中的函数是这样

  1.     /**
  2.         * @name  循环调用 [七牛云保存]
  3.         * @param  file_arr    上传的图片数组
  4.     */
  5.     public function catchFile($file_arr)
  6.     {
  7.         // 申明一个数组,用于存储返回值
  8.         $req_arr = array();
  9.         // 获得7牛云配置信息
  10.         $accessKey = Config::get('qiniu.accessKey');
  11.         $secretKey = Config::get('qiniu.secretKey');
  12.         $bucket = Config::get('qiniu.bucket');

  13.         // 读取配置
  14.         $qiniuConfig = Config::get('qiniu');

  15.         // 循环文件
  16.         foreach($file_arr as $k =>$v)
  17.         {
  18.             // 文件
  19.             $file = $v;  
  20.             // 要上传图片的本地路径
  21.             $filePath = $file->getRealPath();
  22.             //后缀
  23.             $ext = pathinfo($file->getInfo('name'), PATHINFO_EXTENSION);
  24.             // 判断是不是图片
  25.             $filetype = ['jpg', 'jpeg', 'gif', 'bmp', 'png'];
  26.             if (!in_array( $ext, $filetype))
  27.             {
  28.                 dowjson(1,"请上传图片类型的文件");
  29.             }
  30.             // 上传到七牛后保存的文件名
  31.             $key = substr(md5($file->getRealPath()) , 0, 5). date('YmdHis') . rand(0, 9999) . '.' . $ext;
  32.         
  33.             // 存文件
  34.             try{
  35.                 $qiniu = new Qiniu($accessKey,$secretKey,$bucket);
  36.                 $result = $qiniu->upload($key, $bucket, $file);
  37.                 if($result === false) {
  38.                     return json(['code'=>'1','msg'=>"上传失败"]);
  39.                 } else {
  40.                     // return json(['code'=>'0','msg'=>"上传成功"]);
  41.                     // return $key;
  42.                     // 添加到返回数组中  这个key就是为了避开多次上传 文件快慢问题
  43.                     $req_arr[$k] = $key ;
  44.                 }
  45.             }catch (Exception $e){
  46.                
  47.                 var_dump($e);
  48.             }
  49.         }
  50.         // 返回数组信息
  51.         return $req_arr;

  52.     }
复制代码



最后就是传入的值 ,传入的值是

  1.         // 拼个文件对象数组出来瞅瞅
  2.         $file_arr = array(
  3.             'logo_url' => request()->file('logo_url'),
  4.             'attorney' => request()->file('attorney'),
  5.             'yyzz' => request()->file('yyzz')
  6.         );
  7.         // var_dump($file_arr);
  8.         // 将这个数组丢到 上传的函数中去执行, 返回的结果为一个 json ;
  9.         $file_arr_req = $this->catchFile($file_arr);
复制代码







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表