勤劳的搬运工 发表于 2022-6-18 00:53:07

php远程图片下载并上传到七牛空间

最近在做一个社区系统,编辑器采用的是wangeditor,因为编辑器没有远程图片下载功能所以自己扩展了一个!

php远程图片下载功能实现步骤:
1、将编辑器中所有html获取到并用正则匹配出所有图片地址
var list = html.match(/src=[\'\"]?([^\'\"]*)[\'\"]?/gi);
2、将所有匹配到的图片地址发送到后端处理
3、将图片在后端用Client下载下来并上传到七牛(如果需要图像处理可以用Intervention Image完成)后返回所有信息
4、将所有之前的图片地址替换成新图片地址并将html源码设置到编辑器中


获取编辑器代码中的所有图片
/**
* 获取图片列表
* @param html//传入html代码
* @returns {*[]}
*/
GetImage(html){
    // 正则匹配出所有图片
    var list = html.match(/src=[\'\"]?([^\'\"]*)[\'\"]?/gi);
    // 七牛链接的内容(如果图片链接包含该内容表示上传的图片)
    var searchStr = 'image.zhuansky.com';
    var Arr = [];
    if (list != null){
      for (var i=0;i<list.length;i++){
            //判断图片是否是外链的图片
            if(list.indexOf(searchStr)==-1){
                // 替换匹配时候出现的多余字符
                list = list.replace('src="','');
                Arr = list.replace('"','');
            }
      }
    }
    return Arr;
}

// 下载远程图片 菜单点击事件
clickHandler() {
    // 获取编辑器的内容
    var html = editor.txt.html();
    //获取图片列表
    var list = this.GetImage(html);
    //如果存在图片则获取
    if (list.length > 0){
      // 显示加载图标
      var index = layer.load(1, {
            shade: //0.1透明度的白色背景
      });
      // 发送到后台
      $.ajax({
            headers: {'X-CSRF-TOKEN': $('Meta').attr('content')},
            type:'POST',
            url:'/down_remote_img',
            data:{'list':list},
            success:function (v) {
                if(ajaxStatus(v.status)==1){
                  var data = v.data;
                  var data_list = data.list;
                  console.log(data_list.status);
                  console.log(data_list.source);
                  console.log(data_list.url);
                  console.log(html.replace(data_list.source,data_list.url));
                  //开始替换内容中的所有链接
                  for (var i=0;i<data_list.length;i++){
                        if (data_list.status==1){
                            html = html.replace(data_list.source,data_list.url);
                        }
                  }
                  editor.txt.html(html);
                  //关闭加载图标
                  layer.close(index);
                  //显示信息
                  var message = data.total==data.success
                        ? '图片下载成功'
                        : "图片共有{data.total}个,成功{data.success}个,失败{data.error}个"
                  ;
                  layer.msg(message);
                }
            }
      });
    }
}


php抓取远程图片方法

/**
* 抓取远程图片
* @param $iamgeList Array 接收的图片地址列表
* @return Array
*/
private function catcher(Array $imageList){
    $list = [];
    $success = $error = 0;
    $client = new Client(['verify'=>false]);                                                   //忽略SSL错误
    $Storage = \Storage::disk('qiniu');
    foreach($imageList as $val){
      if(!empty($val)){
            if(strpos($val,'http://') == 0 || strpos($val,'https://') == 0){
                $data = $client->get($val)->getBody()->getContents();//获取图片内容
                $ImageInfo = pathinfo(parse_url($val)['path']);                   //获取图片信息
                $ImageWidth = Image::make($data)->height();                  //获取图片宽度
                $Image_Width_Max = get_config('Image_Width_Max');       //图片最大允许
                $FileName = time()."_".mt_rand(10000,999999).".".$ImageInfo['extension'];
                //判断图片宽度是否超出最大限制
                if($ImageWidth > $Image_Width_Max){
                  $data = Image::make($data)->widen($Image_Width_Max)->encode($ImageInfo['extension']);
                }
                //上传图片
                $Storage->put($FileName,$data);
                //判断图片是否上传成功
                $status = $Storage->exists($FileName);
                if($status){
                  $list[] = [
                        "status" =>1,
                        "url" => $Storage->url($FileName),
                        "size" => $Storage->size($FileName),
                        "title" => $FileName,
                        "original" => $FileName,
                        "source" => $val
                  ];
                  $success++;
                }else{
                  $list[] = [
                        "status" =>0,
                        "source" => $val
                  ];
                  $error++;
                }
            }
      }
    }
    return [
      'total'=>count($imageList),
      'error'=>$error,
      'success'=>$success,
      'list'=> $list
    ];
}
/**
   * 下载远程图片
   * @param Request $request
   * @return void
   */
    function downRemoteImg(Request $request){
      if (count($request->list) > 0){
            $data = $this->catcher($request->list);
            return ['status'=>1,'message'=>'设置成功','data'=>$data];
      }
      return ['status'=>0,'message'=>'错误!'];
    }
页: [1]
查看完整版本: php远程图片下载并上传到七牛空间