vue-html5-editor富文本编辑器抓取网络图片本地化

在vue中使用vue-html5-editor做的文章内容编辑器,至于怎么引用可另行百度,网络上有很多介绍;本文主要介绍如何在复制粘贴的时候跳过跨域限制和禁止外站的图片请求问题。

本文的方法比较笨拙,一起交流学习。

在研究使用vue-html5-editor的过程中,并没有发现对于复制粘贴过来图片的单独处理,倒是有一个insertImageUrl方法用来处理图片通过url粘贴过来的逻辑,不会重写该方法且该方法只针对通过图片功能上传的方式,因此放弃了。

后来实在没有办法了,决定在暴露出来的监听事件updateData方法中进行改造,思路如下:
1、监听文章内容变化,使用正则判断文章内容中是否有标签,并获取判断该标签中的src属性是否含有http或者https类型的图片链接;
2、提取出来图片的url链接;
3、调用后台接口,参数为url链接,通过后台接口访问图片链接并保存图片到自己的服务器,然后返回自己的服务器的图片url链接(这块我没有实现,我简单用base64做了测试);

前端代码:

async updateData(e = '') {
      var innerHTML = e.replace(/crossorigin="anonymous"/g,"");
      // 判断内容中是否有图片元素
      const imgRegex = /<img\s+[^>]*?src=(["'])(https?:\/\/[^\s'"]+)\1[^>]*>/g;
      var imageUrls = [];
      let match;
      while ((match = imgRegex.exec(innerHTML)) !== null) {
        // 要替换的url,调用后台接口,生成base64字符串
        var url = match[2];
        imageUrls.push(url);
        var result = await this.getHttpImgBase64(url);
        innerHTML = innerHTML.replace(url,result.data.ROOT.BODY.OUT_DATA);
      }
      this.content = innerHTML;
    },
    // 抓取网络图片,生成base64字符串
    getHttpImgBase64(url) {
      var data = new FormData();
      data.append('url',url);
      return getHttpImgBase64(data);
    },

其中return的getHttpImgBase64为调用后端接口的请求。

后端代码:

@ApiOperation(value = "抓取网络图片", notes = "用于适配编辑器,返回base64字符串")
	@PostMapping(value = "/getHttpImgBase64")
	public R<String> getHttpImgBase64(@RequestParam String url) {
		log.info("接收图片网络地址:" + url);
        String encodeToString = "";
        InputStream ins = null;
        try {
        	URL imgURL = new URL(url);//转换URL
        	HttpURLConnection urlConn = (HttpURLConnection) imgURL.openConnection();//构造连接
        	urlConn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36");
        	urlConn.connect();
			if (urlConn.getResponseCode() == 200) {//返回的状态码是200 表示成功
			    ins = urlConn.getInputStream(); //获取输入流,从网站读取数据到 内存中
			    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  
			    byte[] buffer = new byte[1024];  
			    int bytesRead;  
     
			    // 读取InputStream中的数据到ByteArrayOutputStream  
			    while ((bytesRead = ins.read(buffer)) != -1) {  
			        byteArrayOutputStream.write(buffer, 0, bytesRead);  
			    }  
     
			    // 获取ByteArrayOutputStream中的数据到byte[]  
			    byte[] fileInBytes = byteArrayOutputStream.toByteArray();  
     
			    // 使用Base64编码byte[]为字符串  
			    encodeToString = Base64.getEncoder().encodeToString(fileInBytes);
			    
				/**
				 * 1.Java使用BASE64Encoder 需要添加图片头("data:" + contentType + ";base64,"),
				 *   其中contentType是文件的内容格式。
				 * 2.Java中在使用BASE64Enconder().encode()会出现字符串换行问题,这是因为RFC 822中规定,
				 *   每72个字符中加一个换行符号,这样会造成在使用base64字符串时出现问题,
				 *   所以我们在使用时要先用replaceAll("[\\s*\t\n\r]", "")解决换行的问题。
				 */
			    encodeToString = "data:" + urlConn.getContentType() + ";base64," + encodeToString;
			    encodeToString = encodeToString.replaceAll("[\\s*\t\n\r]", "");
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {  
            // 关闭InputStream  
            if (ins != null) {  
                try {  
                	ins.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
		return R.ok(encodeToString);
	}

本人基础知识不太扎实,如果有哪里需要优化的可以在评论区一起交流,另外欢迎补充返回url的代码。

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

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

相关文章

分类规则挖掘(一)

目录 一、分类问题概述&#xff08;一&#xff09;分类规则挖掘&#xff08;二&#xff09;分类规则评估&#xff08;三&#xff09;分类规则应用 二、k-最近邻分类法 一、分类问题概述 动物分类&#xff1a;设有动物学家陪小朋友林中散步&#xff0c;若有动物突然从小朋友身边…

深度学习500问——Chapter08:目标检测(7)

文章目录 8.3.8 RFBNet 8.3.9 M2Det 8.3.8 RFBNet RFBNet有哪些创新点 1. 提出RF block&#xff08;RFB&#xff09;模块 RFBNet主要想利用一些技巧使得轻量级模型在速度和精度上达到很好的trade-off的检测器。灵感来自人类视觉的感受野结构Receptive Fields&#xff08;RFs…

gin-vue-blog 前后端分离项目(已经部署)

gin-vue-blog 前台&#xff1a; 后台&#xff1a; 1.数据库设计&#xff1a;https://blog.csdn.net/m0_73337964/article/details/138137629?spm1001.2014.3001.5501 2.RESTFUL API路由实现&#xff1a;https://blog.csdn.net/m0_73337964/article/details/138321631?spm1…

5G Advanced and Release18简述

5G Advanced 5G-Advanced, formally defined in 3GPP Release 18, represents an upgrade to existing 5G networks. 先睹robot总结的5G Advanced的advancements: Enhanced Mobility and Reliability: 5G-Advanced will support advanced applications with improved mobility…

【人工智能Ⅱ】实验6:目标检测算法

实验6&#xff1a;目标检测算法 一&#xff1a;实验目的与要求 1&#xff1a;了解两阶段目标检测模型 RCNN或Faster RCNN模型的原理和结构。 2&#xff1a;学习通过RCNN或Faster RCNN模型解决目标检测问题。 二&#xff1a;实验内容 常用的深度学习框架包括PyTorch和PaddleP…

一本专业130+总分400+上海交通大学819考研经验上交电子信息与通信工程上岸,真题,大纲,参考书。

今年专业课819信号系统与信号处理130&#xff0c;总分400&#xff0c;复试表现中规中矩&#xff08;初试分数查到才开始复习复试&#xff0c;希望大家汲取教训&#xff0c;初试考完就可以录取开始准备复试&#xff09;&#xff0c;交大初试比重很高&#xff0c;良心学校&#x…

STM32G474 CMAKE VSCODE FREERTOS 导入

一. 文件准备 1. 首先下载 freertos FreeRTOS - Free RTOS Source Code Downloads, the official FreeRTOS zip file release download 2. 移动 FreeRTOS-Kenel 到 moto_control 文件夹下。 3. 将 FreeRTOSConfig.h 放到 /Core/Inc 下面 4. 由于 FreeRTOSConfig.h 中使用了…

数据库(MySQL)—— 事务

数据库&#xff08;MySQL&#xff09;—— 事务 什么是事务事务操作未控制事务测试异常情况 控制事务一查看/设置事务提交方式&#xff1a;提交事务回滚事务 控制事务二开启事务提交事务回滚事务 并发事务问题脏读&#xff08;Dirty Read&#xff09;不可重复读&#xff08;Non…

【LLM第二篇】stable diffusion扩散模型、名词解释

最近在整理大模型的相关资料&#xff0c;发现了几个名词&#xff0c;不是很懂&#xff0c;这里整理一下&#xff1a; stable diffusion&#xff08;SD)模型&#xff1a; 扩散模型&#xff08;Diffusion model&#xff09;的一种&#xff0c;主要用于生成高质量的图像&#xf…

分布式与一致性协议之一致哈希算法(三)

一致哈希算法 如何使用一致哈希算法实现哈希寻址 我们一起来看一个例子&#xff0c;对于1000万个key的3节点KV存储&#xff0c;如果我们使用一致哈希算法增加1个节点&#xff0c;即3节点集群变为4节点集群&#xff0c;则只需要迁移24.3%的数据,如代码所示 package mainimpor…

IoTDB 入门教程 基础篇⑧——数据库管理工具 | IDEA 连接 IoTDB

文章目录 一、前文二、下载iotdb-jdbc三、IDEA驱动四、IDEA连接数据库五、数据库应用六、其他 一、前文 IoTDB入门教程——导读 二、下载iotdb-jdbc 下载地址org/apache/iotdb/iotdb-jdbc&#xff1a;https://maven.proxy.ustclug.org/maven2/org/apache/iotdb/iotdb-jdbc/ 本…

Hive大数据任务调度和业务介绍

目录 一、Zookeeper 1.zookeeper介绍 2.数据模型 3.操作使用 4.运行机制 5.一致性 二、Dolphinscheduler 1.Dolphinscheduler介绍 架构 2.架构说明 该服务内主要包含: 该服务包含&#xff1a; 3.FinalShell主虚拟机启动服务 4.Web网页登录 5.使用 5-1 安全中心…

022、Python+fastapi,第一个Python项目走向第22步:ubuntu 24.04 docker 安装mysql8集群、redis集群(三)

这次来安装mysql8了&#xff0c;以前安装不是docker安装&#xff0c;这个我也是第一次&#xff0c;人人都有第一次嚒 前言 前面的redis安装还是花了点时间的&#xff0c;主要是网上教程&#xff0c;各有各的好&#xff0c;大家千万别取其长处&#xff0c;个人觉得这个环境影响…

一、Mysql索引的底层数据结构与算法

Mysql索引的底层数据结构与算法 前言一、索引数据结构为什么 MySQL 的索引要使用 B 树而不是其他树形结构?比如 B 树?为什么InnoDB存储引擎选择使用Btree索引结构&#xff1f; 二、索引分类思考&#xff1a;以下SQL语句&#xff0c;那个执行效率高&#xff1f;为什么&#xf…

Stable Diffusion AI绘画

我们今天来了解一下最近很火的SD模型 ✨在人工智能领域&#xff0c;生成模型一直是研究的热点之一。随着深度学习技术的飞速发展&#xff0c;一种名为Stable Diffusion的新型生成模型引起了广泛关注。Stable Diffusion是一种基于概率的生成模型&#xff0c;它可以学习数据的潜…

数据仓库实验三:分类规则挖掘实验

目录 一、实验目的二、实验内容和要求三、实验步骤1、创建数据库和表2、决策树分类规则挖掘&#xff08;1&#xff09;新建一个 Analysis Services 项目 jueceshu&#xff08;2&#xff09;建立数据源视图&#xff08;3&#xff09;建立挖掘结构 DST.dmm&#xff08;4&#xff…

Qt模型视图代理之QTableView应用的简单介绍

往期回顾 Qt绘图与图形视图之绘制带三角形箭头的窗口的简单介绍-CSDN博客 Qt绘图与图形视图之Graphics View坐标系的简单介绍-CSDN博客 Qt模型视图代理之MVD(模型-视图-代理)概念的简单介绍-CSDN博客 Qt模型视图代理之QTableView应用的简单介绍 一、最终效果 二、设计思路 这里…

【Android学习】日期和时间选择对话框

实现功能 实现日期和时间选择的对话框&#xff0c;具体效果可看下图(以日期为例) 具体代码 1 日期对话框 1.1 xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android&quo…

EPAI手绘建模APP资源管理和模型编辑器2

g) 矩形 图 26模型编辑器-矩形 i. 修改矩形的中心位置。 ii. 修改矩形的长度和宽度。 h) 正多边形 图 27模型编辑器-内接正多边形 图 28模型编辑器-外切正多边形 i. 修改正多边形的中心位置。 ii. 修改正多边形中心距离端点的长度。 iii. 修改正多边形的阶数。阶数为3&…

排序算法之堆排序

首先在了解堆排序之前我们先来回顾一下什么叫做堆吧&#xff01; 基本概念 堆&#xff08;Heap&#xff09;&#xff1a;是一种特殊的完全二叉树&#xff0c;其中每个节点的值都大于或等于&#xff08;大顶堆&#xff09;或小于或等于&#xff08;小顶堆&#xff09;其子节点的…
最新文章