ueditor解决无法抓取远程背景图片问题的方法(php)

背景

laravel后台经常有用到编辑器的地方,Dcat使用的一般都是UEditor编辑器。最近项目经理在秀米排版以后,将内容复制到UEditor编辑器保存后发现,
在网站页面中发现图片竟然展示失败。经过浏览器控制台发现,图片的域名还是秀米的,那就好说了

解决方案

一、修改配置,允许抓取远程图片

  • UEditor很强大,直接就有配置,开启还是关闭抓取外部图片到本地服务器,该配置在ueditor.config.js文件中,搜索catchRemoteImageEnable,如下图:
    在这里插入图片描述

但是发现项目配置中已经开启了该功能,但是图片还是不展示,那就继续看页面元素,后来发现未抓取过来的图片是背景图。。。。真相了哈,那就修改抓取的代码,增加一个抓取背景图的逻辑

二、增加抓取背景图中的远程图片

1、打开文件ueditor.all.js文件,找到catchRemoteImage方法
2、直接修改该方法

/**
 * 远程图片抓取,当开启本插件时所有不符合本地域名的图片都将被抓取成为本地服务器上的图片
 */
UE.plugins['catchremoteimage'] = function () {
    var me = this,
        ajax = UE.ajax;

    /* 设置默认值 */
    if (me.options.catchRemoteImageEnable === false) return;
    me.setOpt({
        catchRemoteImageEnable: false
    });

    me.addListener("afterpaste", function () {
        me.fireEvent("catchRemoteImage");
    });

    me.addListener("catchRemoteImage", function () {
        console.log("开始抓取" );

        var catcherLocalDomain = me.getOpt('catcherLocalDomain'),
            catcherActionUrl = me.getActionUrl(me.getOpt('catcherActionName')),
            catcherUrlPrefix = me.getOpt('catcherUrlPrefix'),
            catcherFieldName = me.getOpt('catcherFieldName');

        var remoteImages = [],
            imgs = domUtils.getElementsByTagName(me.document, "img"),
            backgroundimagestags = domUtils.getElementsByTagName(me.document, "section span div p "),//抓取背景图片所在的标签
            test = function (src, urls) {
                if (src.indexOf(location.host) != -1 || /(^\.)|(^\/)/.test(src)) {
                    return true;
                }
                if (urls) {
                    for (var j = 0, url; url = urls[j++];) {
                        if (src.indexOf(url) !== -1) {
                            return true;
                        }
                    }
                }
                return false;
            };

        //img标签
        for (var i = 0, ci; ci = imgs[i++];) {
            if (ci.getAttribute("word_img")) {
                continue;
            }
            var src = ci.getAttribute("_src") || ci.src || "";
            if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) {
                remoteImages.push(src);
            }
        }

        //背景图片所在标签
        var backgroundimages = [];
        // console.log("背景图片个数:" + backgroundimagestags.length);
        for (var i = 0, backci; backci = backgroundimagestags[i++];) {

            var bstyle = backci.style;
            var backgroundimgurltag = bstyle['background-image'] || bstyle['background'] || "";
            if (backgroundimgurltag != null && backgroundimgurltag != "") {
                var backsrc = backgroundimgurltag.split("(")[1].split(")")[0].replace(/\"/g, "")
                    || backgroundimgurltag.split("(")[1].split(")")[0].replace(/\"/g, "")
                    || "";
                // console.log("ci_src:" + backsrc);
                if (backsrc != null && backsrc != "") {
                    if (/^(https?|ftp):/i.test(backsrc) && !test(backsrc, catcherLocalDomain)) {
                        backgroundimages.push(backsrc);
                        remoteImages.push(backsrc);
                    }
                }
            }
            // console.log("remoteImages个数:" + remoteImages.length);
        }

        if (remoteImages.length) {
            me.fireEvent('catchremotestart');
            catchremoteimage(remoteImages, {
                //成功抓取
                success: function (r) {
                    try {
                        var info = r.state !== undefined ? r:eval("(" + r.responseText + ")");
                    } catch (e) {
                        return;
                    }

                    /* 获取源路径和新路径 */
                    var i, j, ci, cj, oldSrc, newSrc, list = info.list;


                    //img标签的替换
                    for (i = 0; ci = imgs[i++];) {
                        oldSrc = ci.getAttribute("_src") || ci.src || "";
                        for (j = 0; cj = list[j++];) {
                            if (oldSrc == cj.source && cj.state == "SUCCESS") {  //抓取失败时不做替换处理
                                newSrc = catcherUrlPrefix + cj.url;
                                domUtils.setAttributes(ci, {
                                    "src": newSrc,
                                    "_src": newSrc
                                });
                                break;
                            }
                        }
                    }

                    //背景图片地址的替换
                    var bodyHtml = me.document.body.innerHTML;
                    console.log("上传之前html:" + bodyHtml);
                    for (var a = 0; a < backgroundimages.length; a++) {
                        oldSrc = backgroundimages[a] || "";
                        for (j = 0; cj = list[j++];) {
                            if (oldSrc == cj.source && cj.state == "SUCCESS") {  //抓取失败时不做替换处理
                                newSrc = catcherUrlPrefix + cj.url;
                                console.log("上传之后oldSrc:" + oldSrc);
                                console.log("上传之后newSrc:" + newSrc);
                                // console.log("上传之后html:" + me.document.body.innerHTML.replace(oldSrc, newSrc));

                                //判断旧地址中,是不是有双引号,有的话,替换成单引号
                                if(bodyHtml.indexOf('&quot;'+oldSrc +'&quot;') ){
                                    console.log(45674567890);
                                    bodyHtml = bodyHtml.replace('&quot;'+oldSrc +'&quot;', '&#39;'+newSrc +'&#39;');
                                }else{
                                    console.log("不用替换");
                                    bodyHtml = bodyHtml.replace(oldSrc, newSrc);
                                }

                                console.log("替换之后html:" + bodyHtml);
                                break;
                            }
                        }
                    }
                    me.document.body.innerHTML = bodyHtml;

                    me.fireEvent('catchremotesuccess');
                    me.fireEvent('catchremotecomplete');
                },
                //回调失败,本次请求超时
                error: function () {
                    me.fireEvent("catchremoteerror");
                }
            });
        }

        function catchremoteimage(imgs, callbacks) {
            console.log("1111L:" + imgs.length);
            var params = utils.serializeParam(me.queryCommandValue('serverparam')) || '',
                url = utils.formatUrl(catcherActionUrl + (catcherActionUrl.indexOf('?') == -1 ? '?':'&') + params),
                isJsonp = utils.isCrossDomainUrl(url),
                opt = {
                    'method': 'POST',
                    'dataType': isJsonp ? 'jsonp':'',
                    'timeout': 60000, //单位:毫秒,回调请求超时设置。目标用户如果网速不是很快的话此处建议设置一个较大的数值
                    'onsuccess': callbacks["success"],
                    'onerror': callbacks["error"]
                };
            opt[catcherFieldName] = imgs;
            ajax.request(url, opt);
        }

    });
};
  • 3、里面修改双引号为单引号的部分,是我发现图片是抓取过来了,但是ueditor编辑器回显的时候,因为双引号导致展示不出来,而额外加的。即使不加,网站前台展示也是正常的哟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/770323.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HMI 的 UI 风格创新无限

HMI 的 UI 风格创新无限

变频器配置V20

变频器控制最好是变频电机&#xff0c;在速度不低的情况下工频电机 改变电机转速&#xff0c;调节扭矩&#xff0c; 变频器 L1 L2 L3 ,R S T 电机输入 uvw 电机输出 FSD 制动电阻 设置步骤 恢复出厂设置 p0010:30 p0970:21p0003:3(设定访问级别) P0003 用户访问级别 0 - 4 1…

cadence symbol修改之一

cdaence virtuoso 复制cell&#xff0c;或者拷贝symbol之后&#xff0c;再次调用的时候&#xff0c;symbol还是跟随原来的cell名字 解决办法 打开对应的symbol 修改partName为 cellName

RK3568驱动指南|第十六篇 SPI-第190章 配置模式下寄存器的配置

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

快团团能屏蔽团员某个人吗?有哪些操作步骤?

在快团团里团长不仅拥有发起团购、管理商品和订单的权利&#xff0c;还具备了一项关键功能——屏蔽特定团员的能力。这一功能确保了团长能够维护良好的社群环境&#xff0c;避免不必要的干扰。以下是屏蔽团员的具体步骤&#xff1a; 1. 登录快团团&#xff1a;首先&#xff0c;…

10 - Python文件编程和异常

文件和异常 在实际开发中&#xff0c;常常需要对程序中的数据进行持久化操作&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词&#xff0c;可能需要先科普一下关于文件系统的知识&#xff0c;对于这个概念&#xff0c;维基百科上给出…

【Unity 3D角色移动】

【Unity 3D角色移动】 在Unity 3D中实现角色移动通常涉及到几个关键步骤&#xff0c;包括设置角色的物理属性、处理输入、更新角色的位置以及动画同步。下面是实现基本3D角色移动的步骤和示例代码&#xff1a; 步骤1&#xff1a;设置角色的物理属性 角色通常使用Character Co…

学校卫星电子怎么自动校准时间呢

在学校的教室里&#xff0c;卫星电子钟精准地为师生们提供着时间服务&#xff0c;而其自动校准时间的功能令人称奇。那么&#xff0c;学校卫星电子钟是如何实现自动校准时间的呢&#xff1f; 学校卫星电子钟自动校准时间的原理基于卫星导航系统。常见的如北斗卫星导航系统或 GP…

什么地方适合安装自动气象站?

随着科技的不断进步&#xff0c;自动气象站在气象观测、环境监测以及科研教学等领域发挥着越来越重要的作用。 一、科研机构和高校校园 科研机构和高校校园是安装自动气象站的理想场所。这些地方拥有专业的科研团队和丰富的教育资源&#xff0c;可以为气象站的建设和运营提供有…

学生用小台灯什么牌子的好?列举出几款学生用台灯推荐

眼睛是我们感知世界的窗口&#xff0c;但近年来&#xff0c;儿童青少年的视力健康却受到了严重困扰。数据显示&#xff0c;近视问题在儿童群体中呈现出明显的增长趋势&#xff0c;这给他们的学习和生活带来了诸多不便。虽然现代科技的快速发展使得电子产品成为了我们生活中不可…

VMware Workstation桥接模式无法上网

问题背景 我之前创建过一个虚拟机&#xff0c;当时虚拟机的网络模式使用的是桥接模式&#xff0c;配置好了固定ip地址&#xff0c;是可以正常上网的&#xff0c;中间没有做任何网络上面的配置。但是今天再打开这台虚拟机时&#xff0c;发现竟然不能上网了。 物理主机的ip信息配…

详解COB封装的定义

COB封装全称是Chip on Board&#xff08;板上芯片封装&#xff09;&#xff0c;是一种非常先进的电子封装工艺&#xff0c;其会涉及到将发光芯片直接封装于印刷电路板&#xff08;PCB&#xff09;或者其他类型的互连电气基板上&#xff0c;通过细小的金属线进行键合&#xff0c…

LangChain 入门上篇:模型 I/O 封装

LangChain 是面向大模型的开发框架&#xff0c;是 AGI 时代软件工程的探索和原型。学习 LangChain 需要关注接口的变更。 LangChain 的核心组件 1.模型 I/O 封装 LLMS 大语言模型Chat Models 一套基于 LLMS&#xff0c;但按对话结构重新封装PromptTemplate 提示词模板Output…

七、函数练习

目录 1. 写一个函数可以判断一个数是不是素数。&#xff08;素数只能被1或其本身整除的数&#xff09; 2. 一个函数判断一年是不是闰年。 3.写一个函数&#xff0c;实现一个整形有序数组的二分查找。 4. 写一个函数&#xff0c;每调用一次这个函数&#xff0c;使得num每次增…

Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)

1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现。由于时间的关系&#xff0c;宏哥这里用代码给小伙伴演示两个模块&#xff1a;注册和登录。 2.业务模块封装 因为现在各种APP的层出不群&#xff0c;各式各样的。但是其大多数都有注册、登录。为…

【话题】IT专业入门,高考假期预习指南

IT专业入门&#xff0c;高考假期预习指南 亲爱的高考学子们&#xff0c; 七月的阳光&#xff0c;如同你们的梦想&#xff0c;炽热而明亮。当你们手中的笔落下最后一道题的答案&#xff0c;那不仅仅是对过去十二年寒窗苦读的告别&#xff0c;更是对未知世界探索的启程号角。你们…

surfer做等值线图笔记

surfer等值线图及其白化 **grd文件的制作****白化的边界文件的制作****白化****绘图****逆转坐标轴** grd文件的制作 单击格网&#xff0c;选择x,y,z的数据&#xff0c;选择克里金插值方法&#xff0c;让后确定&#xff0c;保存grd文件 白化的边界文件的制作 surfer新建表&am…

拒绝胶感,清纯甜美邻家女孩!逼真!逼真!SD1.5 更适合初恋般的国产真人大模型—— CNrealisticMIXV40

看惯了AI艺术大片&#xff0c;想寻找适合生成邻家女孩青涩照片的模型。 今天应邀&#xff0c;针对邻家女孩青涩风格进行下尝试。此前推荐过一款支持各种真实&#xff0c;摄影&#xff0c;写实风格模型的合体模型——**赛博Dream | CNrealistic_MIX_V40无损修剪版。**这款模型为…

notepad++ 中文乱码 出现小方格

从word文档直接拷贝过来的文字&#xff0c;到notepad 中文乱码 出现小方格 &#xff1a; 方法&#xff1a;设置-语言格式设置&#xff0c;字体样式更改为宋体&#xff0c;勾选“使用全局字体”&#xff0c;点保存并关闭&#xff0c;则ok

【Python机器学习】算法链与管道——用预处理进行参数选择的注意项

对于许多机器学习算法&#xff0c;提供的特定数据表示非常重要。比如&#xff0c;首先对数据进行缩放&#xff0c;然后手动合并特征&#xff0c;再利用无监督机器学习来学习特征。因此&#xff0c;大多数机器学习应用不仅需要应用多个算法&#xff0c;而且还需要将许多不同的处…