周大胖子 发表于 2019-3-8 14:41:34

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

胖子所遇到的问题:
    也不是哪个奇葩的网站, 介绍我用 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 方法,
/**
   * @param string $saveName
   * @param string $bucket
   * @param file$files
   * @return mixed
   * @throws Exception
   * @throws \Exception
   * 单文件上传,如果添加多个文件则只上传第一个 [这个目前被我改掉了,多文件时候 则传入 think的file对象,循环调用]
   */
    public function upload($saveName = '', $bucket = '',$files)
    {
      // 获取七牛的token
      $token = $this->_getUploadToken($bucket);
      // 在这里接收到的是文件数组
      if (empty($files)) {
            throw new Exception('没有文件被上传', 10002);
      }
      // 返回数组的所有值(非键名)
      // ------老莫修改的值.s
      $values = $files->getInfo();
      // -------老莫.end
      // 循环获取文件数
      $uploadManager = new UploadManager();
      if (empty($saveName)) {
            
            $saveName = hash_file('sha1', $values['tmp_name']).time();
      }
      // 把字符串打散为数组 [其实是为了拿文件名后缀]
      $infoArr = explode('.', $values['name']);
      // 然后 拿到这个文件名后缀
      $extension = array_pop($infoArr);
      // 拼出文件名
      $fileInfo = $saveName . '.' . $extension;
   
      // 在这个位置更改 上传为 数组循环上传即可
      list($ret, $err) = $uploadManager->putFile($token, $saveName, $values['tmp_name']);
      if ($err !== null) {
            throw new Exception('上传出错'.serialize($err));
      }
      return $ret['key'];
    }

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


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

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

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

      // 循环文件
      foreach($file_arr as $k =>$v)
      {
            // 文件
            $file = $v;
            // 要上传图片的本地路径
            $filePath = $file->getRealPath();
            //后缀
            $ext = pathinfo($file->getInfo('name'), PATHINFO_EXTENSION);
            // 判断是不是图片
            $filetype = ['jpg', 'jpeg', 'gif', 'bmp', 'png'];
            if (!in_array( $ext, $filetype))
            {
                dowjson(1,"请上传图片类型的文件");
            }
            // 上传到七牛后保存的文件名
            $key = substr(md5($file->getRealPath()) , 0, 5). date('YmdHis') . rand(0, 9999) . '.' . $ext;
      
            // 存文件
            try{
                $qiniu = new Qiniu($accessKey,$secretKey,$bucket);
                $result = $qiniu->upload($key, $bucket, $file);
                if($result === false) {
                  return json(['code'=>'1','msg'=>"上传失败"]);
                } else {
                  // return json(['code'=>'0','msg'=>"上传成功"]);
                  // return $key;
                  // 添加到返回数组中这个key就是为了避开多次上传 文件快慢问题
                  $req_arr[$k] = $key ;
                }
            }catch (Exception $e){
               
                var_dump($e);
            }
      }
      // 返回数组信息
      return $req_arr;

    }



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

      // 拼个文件对象数组出来瞅瞅
      $file_arr = array(
            'logo_url' => request()->file('logo_url'),
            'attorney' => request()->file('attorney'),
            'yyzz' => request()->file('yyzz')
      );
      // var_dump($file_arr);
      // 将这个数组丢到 上传的函数中去执行, 返回的结果为一个 json ;
      $file_arr_req = $this->catchFile($file_arr);







页: [1]
查看完整版本: TP5 使用 gmars\qiniu 上传多图时 【七牛的使用问题】