dmz社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1046|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2022-7-8 01:41
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    52

    主题

    41

    帖子

    263

    积分

    荣誉会员

    积分
    263

    发表于 2022-6-18 00:53:07 | 显示全部楼层 |阅读模式

    本站资源全部免费,回复即可查看下载地址!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    最近在做一个社区系统,编辑器采用的是wangeditor,因为编辑器没有远程图片下载功能所以自己扩展了一个!
    1.png
    php远程图片下载功能实现步骤:
    1、将编辑器中所有html获取到并用正则匹配出所有图片地址
    [AppleScript] 纯文本查看 复制代码
    var list = html.match(/src=[\'\"]?([^\'\"]*)[\'\"]?/gi);

    2、将所有匹配到的图片地址发送到后端处理
    3、将图片在后端用Client下载下来并上传到七牛(如果需要图像处理可以用Intervention Image完成)后返回所有信息
    4、将所有之前的图片地址替换成新图片地址并将html源码设置到编辑器中


    获取编辑器代码中的所有图片
    [JavaScript] 纯文本查看 复制代码
    /**
     * 获取图片列表
     * @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[i].indexOf(searchStr)==-1){
                    // 替换匹配时候出现的多余字符
                    list[i] = list[i].replace('src="','');
                    Arr[Arr.length] = list[i].replace('"','');
                }
            }
        }
        return Arr;
    }

    [JavaScript] 纯文本查看 复制代码
    // 下载远程图片 菜单点击事件
    clickHandler() {
        // 获取编辑器的内容
        var html = editor.txt.html();
        //获取图片列表
        var list = this.GetImage(html);
        //如果存在图片则获取
        if (list.length > 0){
            // 显示加载图标
            var index = layer.load(1, {
                shade: [0.1,'#fff'] //0.1透明度的白色背景
            });
            // 发送到后台
            $.ajax({
                headers: {'X-CSRF-TOKEN': $('Meta[name="csrf-token"]').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[0].status);
                        console.log(data_list[0].source);
                        console.log(data_list[0].url);
                        console.log(html.replace(data_list[0].source,data_list[0].url));
                        //开始替换内容中的所有链接
                        for (var i=0;i<data_list.length;i++){
                            if (data_list[i].status==1){
                                html = html.replace(data_list[i].source,data_list[i].url);
                            }
                        }
                        editor.txt.html(html);
                        //关闭加载图标
                        layer.close(index);
                        //显示信息
                        var message = data.total==data.success
                            ? '图片下载成功'
                            : "图片共有{data.total}个,成功{data.success}个,失败{data.error}个"
                        ;
                        layer.msg(message);
                    }
                }
            });
        }
    }



    php抓取远程图片方法
    [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
        ];
    }

    [PHP] 纯文本查看 复制代码
    /**
         * 下载远程图片
         * @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、本站所有内容均为互联网收集或网友分享或网络购买,本站不破解、不翻录任何视频!
    2、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意!
    3、本站资源仅供本站会员学习参考,不得传播及用于其他用途,学习完后请在24小时内自行删除.
    4、本站资源质量虽均经精心审查,但也难保万无一失,若发现资源有问题影响学习请一定及时点此进行问题反馈,我们会第一时间改正!
    5、若发现链接失效了请联系管理员,管理员会在2小时内修复
    6、如果有任何疑问,请加客服QQ:1300822626 2小时内回复你!
    回复

    使用道具 举报

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

    本版积分规则

    QQ|Archiver|小黑屋|本站代理|dmz社区

    GMT+8, 2024-12-23 11:18 , Processed in 0.078643 second(s), 32 queries .

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

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