Vue3使用vue-quill富文本编辑器并实现图片自定义上传替换默认base64格式图片

devtools/2024/11/12 4:13:22/

本文介绍在vue3环境下使用vue-quill富文本编辑器,并实现使用自定义上传接口将图片上传至服务器并保存为img标签src为服务器中图片的地址而不是默认的base64格式图片。从而解决富文本编辑器使用base64导致字段超长问题。

1.安装依赖库

npm install @vueup/vue-quill --save
npm install quill-image-uploader --save

vue-quill为基础富文本组件

quill-image-uploader为图片上传扩展模块

2.引入组件

javascript">//局部引入
import { QuillEditor, Quill } from '@vueup/vue-quill';
import ImageUploader from "quill-image-uploader";
import '@vueup/vue-quill/dist/vue-quill.snow.css';
Quill.register("modules/imageUploader", ImageUploader);
export default {components: {QuillEditor},
}

3.使用组件

javascript"><quill-editorclass="ql-editor":options="editorOption"v-model:content="form.content"content-type="html">
</quill-editor>

其中content-type设置为html后v-model绑定的值则自动获取到为带html标签的文本

4.配置图片上传以及富文本组件

javascript">editorOption: {modules: {imageUploader: {upload: async (file) => {let res = await uploadFileAPI({file}) // 此处为自己的上传接口return res.data.filePath // 此处替换为接口返回的文件路径}},toolbar: [['bold', 'italic', 'underline', 'strike'], // 加粗 斜体 下划线 删除线['blockquote', 'code-block'], // 引用  代码块[{ header: 1 }, { header: 2 }], // 1、2 级标题[{ list: 'ordered' }, { list: 'bullet' }], // 有序、无序列表[{ script: 'sub' }, { script: 'super' }], // 上标/下标[{ indent: '-1' }, { indent: '+1' }], // 缩进[{ direction: 'rtl' }], // 文本方向[{ 'size': ['small', false, 'large', 'huge'] }],  // 字体大小[{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题[{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色[{ font: [] }], // 字体种类[{ align: [] }], // 对齐方式['clean'], // 清除文本格式['link', 'image', 'video'], // 链接、图片、视频],},

此处需要使用自己的上传接口,下面为前端上传接口示例:

javascript">export const uploadFileAPI = (data) => {return request({url: "/file/upload",method: "post",data,headers: { // 如果接口报错,检查是不是加了这个参数"Content-Type": "multipart/form-data"}})
}

后端接口示例(此处使用的为本地nginx文件服务器,可替换为云服务器地址):

final String UPLOAD_DIRECTORY = "D:/Project/FileServer/"; // 此处为本地存储路径示例
final String BASE_URL = "http://localhost:9090/"; // 本地文件服务器url
@PostMapping("/upload")
public R uploadFile(@RequestParam("file") MultipartFile file) {if (file.isEmpty()) {return R.failed("请选择要上传的文件");}try {// 获取原始文件名String originalFilename = file.getOriginalFilename();// 生成新的文件名,以防止文件名冲突String newFilename = null;if (originalFilename != null) {newFilename = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));}// 文件保存路径String filePath = UPLOAD_DIRECTORY + newFilename;// 保存文件到服务器file.transferTo(new File(filePath));// 返回文件上传成功的相关信息Map<String, String> res = new HashMap<>();res.put("fileName", newFilename);res.put("filePath", BASE_URL + newFilename);return R.ok(res, "上传成功");} catch (Exception e) {return R.failed("文件上传失败: " + e.getMessage());}
}

5.汉化富文本工具栏

/deep/ .ql-snow .ql-tooltip[data-mode=link]::before {content: "请输入链接地址:";
}
/deep/ .ql-snow .ql-tooltip.ql-editing a.ql-action::after {border-right: 0px;content: '保存';padding-right: 0px;
}/deep/  .ql-snow .ql-tooltip[data-mode=video]::before {content: "请输入视频地址:";
}/deep/  .ql-snow .ql-picker.ql-size .ql-picker-label::before,
/deep/  .ql-snow .ql-picker.ql-size .ql-picker-item::before {content: '14px';
}
/deep/  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before,
/deep/  .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before {content: '10px';
}
/deep/  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before,
/deep/  .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before {content: '18px';
}
/deep/  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,
/deep/  .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before {content: '32px';
}/deep/  .ql-snow .ql-picker.ql-header .ql-picker-label::before,
/deep/  .ql-snow .ql-picker.ql-header .ql-picker-item::before {content: '文本';
}
/deep/  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
/deep/  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {content: '标题1';
}
/deep/  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
/deep/  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {content: '标题2';
}
/deep/  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
/deep/  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {content: '标题3';
}
/deep/ .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
/deep/ .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {content: "标题4";
}
/deep/  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
/deep/  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {content: '标题5';
}
/deep/ .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
/deep/ .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {content: '标题6';
}/deep/  .ql-snow .ql-picker.ql-font .ql-picker-label::before,
/deep/  .ql-snow .ql-picker.ql-font .ql-picker-item::before {content: '标准字体';
}
/deep/  .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,
/deep/  .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before {content: '衬线字体';
}
/deep/  .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,
/deep/  .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before {content: '等宽字体';
}
/deep/  .ql-align-center{text-align: center;
}
/deep/  .ql-align-right{text-align: right;
}
/deep/  .ql-align-left{text-align: left;
}


http://www.ppmy.cn/devtools/30787.html

相关文章

Tomcat PUT方法任意写文件漏洞(CVE-2017-12615)

1 漏洞原理 在Apache Tomcat服务器中&#xff0c;PUT方法通常用于上传文件。攻击者可以通过发送PUT请求&#xff0c;将恶意文件上传到服务器。 当攻击者发送PUT请求时&#xff0c;Tomcat服务器会将请求中的数据写入指定的文件。如果攻击者能够控制文件路径&#xff0c;那么他们…

k8s安装nginx Ingress超详细指南

在本全面的 Ingress 指南中&#xff0c;您将学习如何在 Kubernetes 上设置 Nginx Ingress控制器并使用 DNS 配置 Ingress。 目前有两种 Nginx Ingress 控制器。 kubernetes 社区的 Nginx Ingress 控制器Nginx Inc 开发的 Nginx Ingress 控制器 我们将使用 Kubernetes 社区 N…

24考研双非上岸武汉理工大学电子信息专硕,855考研经验

目录 一、考研择校经验 二、武理考研初试经验 三、武理考研复试经验 一、考研择校经验 我建议学弟学妹们确定院校时没必要一上来就说我一定要考某个院校。其实考哪个学校是要在考研备考的过程中慢慢探索&#xff0c;慢慢研究的&#xff0c;不过最晚9月初一定要确定院校了&a…

爬虫 - 基于requests进行二次开发

项目地址 https://github.com/markadc/wauo.git持续更新中… 演示 # -*- coding: utf-8 -*-from wauo import WauoSpider, Responses WauoSpider(default_headers{Cookie: Your Cookies}) url https://www.baidu.com resp: Response s.send(url)print(resp) print(resp.r…

ubuntu20.04安装RabbitMQ 3.11.19+Erlang 25.3.1

1、检查RabbitMQ、Erlang版本 Erlang Version Requirements | RabbitMQ 2、ubuntu20.04对应的是 focal 3、下载安装Erlang 下载地址&#xff1a;http://packages.erlang-solutions.com/erlang/debian/pool/ sudo dpkg -i esl-erlang_25.3-1~ubuntu~focal_amd64.deb sudo apt…

解决Git提交失败的问题:配置user.name和user.email

文章目录 一、场景描述二、原因分析三、解决办法1、全局配置2、单个项目配置3、验证配置 四、总结 在软件开发过程中&#xff0c;使用Git进行版本控制是必不可少的。然而&#xff0c;有时候在用Visual Studio Code提交代码时可能会遇到提交失败的情况&#xff0c;其中一个常见的…

爬虫学习:基本网络请求库的使用

目录 一、urllib网络库 1.urlopen()方法 2.request方法 二、requests网络请求库 1.主要方法 2.requests.get()和requests.post() 一、urllib网络库 1.urlopen()方法 语法格式&#xff1a; urlopen(url,data,timeout,cafile,capath,context) # url:地址 # data:要提交的数据…

【C 数据结构】深度优先搜索、广度优先搜索

文章目录 【 1. DFS 深度优先搜索 】1.1 基本原理1.2 C 实现 【 2. BFS 广度优先搜索 】2.1 基本原理2.2 C 实现 【 3. 深度优先生成树、广度优先生成树 】【 4. 深度优先生成森林、广度优先生成森林 】4.1 深度优先生成森林4.2 广度优先生成森林 对存储的图中的顶点进行遍历搜…