找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 60|回复: 0

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

[复制链接]

2万

主题

128

回帖

10万

积分

管理员

积分
105860
发表于 2022-6-20 15:11:54 | 显示全部楼层 |阅读模式 IP:山东省 移动/数据上网公共出口

登录后更精彩...O(∩_∩)O...

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

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


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

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'=>'错误!'];
    }
回复

使用道具 举报

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

本版积分规则

QQ|IOTsec-Zone|在线工具|CTF WiKi|CTF平台汇总|CTF show|ctfhub|棱角安全|rutracker|攻防世界|php手册|peiqi文库|CyberChef|猫捉鱼铃|手机版|小黑屋|cn-sec|分享屋 ( 鲁ICP备2021028754号 )

GMT+8, 2024-5-18 14:35

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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