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

server/2024/10/18 18:28:42/

在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);//转换URLHttpURLConnection 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 blocke.printStackTrace();} finally {  // 关闭InputStream  if (ins != null) {  try {  ins.close();  } catch (IOException e) {  e.printStackTrace();  }  }  }  return R.ok(encodeToString);}

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


http://www.ppmy.cn/server/33030.html

相关文章

EPAI手绘建模APP演示板、材质编辑器、样式编辑器

(11) 更多 图 74 更多工具栏 ① 演示板&#xff1a;打开关闭演示板。演示板用来显示从设备导入的模型图纸图片或者打开模型建模教程网页&#xff0c;是建模过程中一个辅助功能。有些设备有小窗口功能有些没有&#xff0c;对于没有小窗口功能的设备&#xff0c;通过演示板能够在…

数据结构---单链表

题目&#xff1a;构造一个单链表。 使用的软件&#xff1a;VS2022使用的语言&#xff1a;C语言使用的项目&#xff1a;test.c Setlist.h Setlish.c 项目实践&#xff1a; Setlist.h的代码为&#xff1a; #pragma once#include<stdio.h> #include<stdlib.h> #incl…

Nodejs-异步并发控制

异步并发控制 在 node 中可以利用异步发起并行调用。但是如果并发量过大&#xff0c;就会导致下层服务器吃不消。 bagpipe 解决方案 解决方案 通过一个队列来控制并发量如果当前活跃的异步调用小于限定值&#xff0c;从队列中取出执行如果活跃调用达到限定值&#xff0c;调…

C#知识|泛型集合List相关方法

哈喽&#xff0c;你好&#xff0c;我是雷工&#xff01; 以下为泛型集合List相关方法的学习笔记。 01 集合定义 集合定义的时候&#xff0c;无需规定元素的个数。 02 泛型说明 泛型表示一种程序特性&#xff0c;也就是在定义的时候&#xff0c;无需指定特定的类型&#xff…

SQL 基础 | AVG 函数的用法

在SQL中&#xff0c;AVG()是一个聚合函数&#xff0c;用来计算某个列中所有值的平均值。 它通常与GROUP BY子句一起使用&#xff0c;以便对分组后的数据进行平均值计算。 AVG()函数在需要了解数据集中某个数值列的中心趋势时非常有用。 以下是AVG()函数的一些常见用法&#xff…

vue路由懒加载是什么

Vue路由懒加载是一种优化技术&#xff0c;旨在减少应用程序的初始加载时间并提高性能。具体来说&#xff0c;它允许我们在用户实际需要访问某个路由时&#xff0c;才加载对应的组件代码&#xff0c;而不是在应用程序启动时一次性加载所有组件。 举个例子来说明Vue路由懒加载的…

CMakeLists.txt语法规则:部分常用命令说明一

一. 简介 前一篇文章简单介绍了CMakeLists.txt 简单的语法。文章如下&#xff1a; CMakeLists.txt 简单的语法介绍-CSDN博客 接下来对 CMakeLists.txt语法规则进行具体的学习。本文具体学习 CMakeLists.txt语法规则中常用的命令。 二. CMakeLists.txt语法规则&#xff1a;…

DDD:根据maven的脚手架archetype生成ddd多模块项目目录结构

随着领域驱动的兴起&#xff0c;很多人都想学习如何进行ddd的项目开发&#xff0c;那ddd的项目结构是怎么样的&#xff1f;又是如何结合SpringBoot呢&#xff1f;那么针对这个问题&#xff0c;笔者使用maven的archetype封装一个相对通用的ddd的项目目录&#xff0c;方便一键生成…