该案例的情况

  • vue版本:vue cli3
  • 插件:vue-quill-editor
  • vue-quill-editor的增强模块:quill-image-extend-module

quill-image-extend-module功能:

  • 提供图片上传到服务器的功能
  • 复制插入
  • 显示上传进度
  • 显示上传成功或者失败

文章目录

  • 一、选择这种方式的来龙去脉(读者可自行跳过)
  • 二、实现
    • 2.1 安装插件
    • 2.2 引入
    • 2.3 使用
      • 2.3.1 方法一(推荐)
      • 2.3.2 方法一延申:不改写方法
      • 2.3.3 方法三(不推荐)

一、选择这种方式的来龙去脉(读者可自行跳过)

本意呢,是打算将整个富文本的数据都上传到阿里云服务器上,但是把 Quill 数据封装进 fromData 中上传时,总是报错,报错信息是 Required request part 'file' is not present,如下

这个问题应该是前端传参和后台接收参数不一致的问题,和我的后台协商之后,发现并没有什么不妥之处,因为通过 el-upload 上传图片也是通过 formData 数据,是可以成功上传的。研究考虑一番之后,决定放弃此方式,改用存储数据库来实现,将富文本中插入的图片上传服务器、富文本的 html 字符串存储数据库。之所以将图片上传服务器,还有另一个原因,就是如果直接将富文本的 html 字符串存储数据库的话,富文本中插入的图片会以 base64 格式存储,占空间太大;而将图片上传服务器,把返回的图片地址以<img src="http://……" /> 存入富文本的 html 字符串中,可以大大缩小空间。下面上两张图对比一下

base64 格式:(截图没有截下全部,大概31kb)

图片地址格式:

二、实现

好了,来龙去脉记录完毕,下面开始说说如何实现

2.1 安装插件
npm install vue-quill-editor --save-dev
npm install quill-image-extend-module --save-dev

注:在下面的使用过程中,如果出现 modules 里面缺少相关依赖,直接在项目中执行 npm install,就可以

2.2 引入
import { quillEditor, Quill } from 'vue-quill-editor'
import { container, ImageExtend, QuillWatch } from 'quill-image-extend-module'
Quill.register('modules/ImageExtend', ImageExtend)
2.3 使用

由于是第一次做这个功能,百度了很多,测试了两种方法。下面对这两种方法进行分析

2.3.1 方法一(推荐)
  • 实现思路:使用 quill-editor,通过改写 ImageExtend,进行图片上传、 img 标签改写(将图片地址插入 img 标签)
  • 效果:可以实现图片上传服务器、图片地址以 src 方式插入 img 标签并回显在 quill 编辑器内容中
<template><div class="testuploadquillpicandback"><quill-editor @change="onEditorChange($event)"id="desc" ref="quill" v-model="desc" :options="editorOption"></quill-editor></div>
</template><script>import { quillEditor, Quill } from 'vue-quill-editor'import { container, ImageExtend, QuillWatch } from 'quill-image-extend-module'Quill.register('modules/ImageExtend', ImageExtend)export default{data() {return {desc: '',editorOption: {placeholder: '此处输入赛事规程',modules: {ImageExtend: {loading: true,name: 'file',//图片参数名size: 1, // 可选参数 图片大小,单位为M,1M = 1024kbaction: '/feelings/common/upload/file',//上传的服务器地址,如果action为空,则采用base64插入图片// response 为一个函数,用来获取服务器返回的具体图片地址response: res => {console.log(res)const imgUrl = 'http://' + res.datareturn imgUrl},headers: xhr => {// 上传图片请求需要携带token的 在xhr.setRequestHeader中设置,这里我的token存放在sessionStorage中xhr.setRequestHeader("token", window.sessionStorage.getItem('token'))},// 可选参数 设置请求头部sizeError: () => {}, // 图片超过大小的回调start: () => {}, // 可选参数 自定义开始上传触发事件end: () => {}, // 可选参数 自定义上传结束触发的事件,无论成功或者失败error: () => {}, // 可选参数 上传失败触发的事件success: () => {console.log('ImageExtend中的success:上传成功')}, // 可选参数  上传成功触发的事件change: (xhr, formData) => {// xhr.setRequestHeader('myHeader','myValue')// formData.append('token', 'myToken')} // 可选参数 每次选择图片触发,也可用来设置头部,但比headers多了一个参数,可设置formData},// 如果不上传图片到服务器,此处不必配置toolbar: {// container为工具栏,此次引入了全部工具栏,也可自行配置container: [["bold", "italic", "underline", "strike"],["blockquote", "code-block"],[{ header: 1 }, { header: 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: [] }],["image"]],// 上传成功,回显图片(会进入如上面ImageExtend的各过程,返回<img src="http://xx.xx.xx.xx:xxxx/file/xxx.jpg">)handlers: {image: function() {// 劫持原来的图片点击按钮事件QuillWatch.emit(this.quill.id)}}}}},}},methods: {// quill的change事件onEditorChange(e) {console.log('onEditorChange打印e')console.log(e)}}}
</script>

参考自:https://www.cnblogs.com/dachengzizi/p/11805488.html

2.3.2 方法一延申:不改写方法
  • 实现思路:使用 quill-editor,不改写方法
  • 效果:可以实现图片上传,但是返回图片地址为 base64 格式
<template><div class="testuploadquillpicandback"><quill-editor @change="onEditorChange($event)"id="desc" ref="quill" v-model="desc"></quill-editor></div>
</template><script>import { quillEditor, Quill } from 'vue-quill-editor'import { container, ImageExtend, QuillWatch } from 'quill-image-extend-module'Quill.register('modules/ImageExtend', ImageExtend)export default{data() {return {desc: ''}},methods: {// quill的change事件onEditorChange(e) {console.log('onEditorChange打印e')console.log(e)}}}
</script><style>
</style>

参考自:https://www.cnblogs.com/bingchenzhilu/p/11951571.html

2.3.3 方法三(不推荐)
  • 实现思路:使用 quill-editor 和 input,重写 ImageExtend,并通过 input 的 change 事件进行上传
  • 效果:可以实现图片上传,但是图片地址插入 quill 内较麻烦(我没有尝试去做这个,因为上面方法已经可以满足我的需求,而且更方面管理)
<template><div class="testuploadquillpicandback"><quill-editor @change="onEditorChange($event)"id="desc" ref="quill" v-model="desc" :options="editorOption"></quill-editor>// 实际使用时,可以隐藏以得到更好的体验<input type="file" @change="change" id="upload" /></div>
</template><script>import { quillEditor, Quill } from 'vue-quill-editor'import { container, ImageExtend, QuillWatch } from 'quill-image-extend-module'Quill.register('modules/ImageExtend', ImageExtend)export default{data() {return {desc: '',editorOption: {placeholder: '此处输入赛事规程',modules: {ImageExtend: {loading: true,name: 'file',//图片参数名size: 1, // 可选参数 图片大小,单位为M,1M = 1024kbaction: '/feelings/common/upload/file',//上传的服务器地址,如果action为空,则采用base64插入图片// response 为一个函数,用来获取服务器返回的具体图片地址response: res => {console.log('ImageExtend中的response')console.log(res)const imgUrl = 'http://' + res.datareturn imgUrl},// 注意:原作者中的res.data和我的不一样,我的res.data=图片地址headers: xhr => {// 上传图片请求需要携带token的 在xhr.setRequestHeader中设置xhr.setRequestHeader("token", window.sessionStorage.getItem('token'))},// 可选参数 设置请求头部sizeError: () => {}, // 图片超过大小的回调start: () => {}, // 可选参数 自定义开始上传触发事件end: () => {}, // 可选参数 自定义上传结束触发的事件,无论成功或者失败error: () => {}, // 可选参数 上传失败触发的事件success: () => {console.log('ImageExtend中的success:上传成功')}, // 可选参数  上传成功触发的事件change: (xhr, formData) => {} // 可选参数 每次选择图片触发,也可用来设置头部,但比headers多了一个参数,可设置formData},// 如果不上传图片到服务器,此处不必配置toolbar: {// container为工具栏,此次引入了全部工具栏,也可自行配置container: [["bold", "italic", "underline", "strike"],["blockquote", "code-block"],[{ header: 1 }, { header: 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: [] }],["image"]],// 进入input的change事件,可以实现上传,但是不能把返回的图片地址插入到quill内容中handlers: {image: function(value) {if (value) {// 劫持原来的图片点击按钮事件,#upload即为自己写的上传,可以使用最简单的inputdocument.querySelector('#upload').click()} else {this.quill.format('image', false)}}}}}},}},methods: {// quill的change事件onEditorChange(e) {console.log('onEditorChange打印e')console.log(e)},// input的change事件:可以实现上传,但是不能把返回的图片地址插入到quill内容中async change(e) {console.log('input的change事件')let file = e.target.files[0]const formData = new FormData()formData.append('file', file)// 下面可以根据后端写的上传接口进行传递参数const { data: res } = await this.$http.post('/feelings/common/upload/file', formData)console.log(res)if (res.code !== 200) {this.$message.error('上传失败')}this.$message.success('上传成功')}}}
</script><style>
</style>


好了,到此为止,两种方式测试完毕,读者可根据自己的需求写适合自己的组件

Vue Element UI 之富文本图片上传服务器 + 图片地址插入富文本相关推荐

  1. Vue+SpringBoot+OSS+element实现图片上传服务器+图片展示墙

    1.技术选型: (1)Vue(前端) (2)Element(上传图片组件) (3)SpringBoot(后端) (4)Mybatis(数据库操作) (3)OSS(阿里云存储服务器) 2.实现效果概述: ...

  2. quill富文本编辑器quill粘贴图片上传服务器

    强大的富文本编辑器:quill github:32k start++,:https://github.com/quilljs/quill quill粘贴图片上传服务器 <link href=&q ...

  3. 使用vue+elementUi+springBoot实现图片上传,图片删除,图片展示

    使用vue+elementUi+springBoot实现图片上传,图片删除,图片展示 环境配置 准备环境 使用软件 图片上传 图片删除 图片显示 所有代码均为参考,每个人的方法不一样,效果不一样,该代 ...

  4. vue+vant图片上传压缩图片大小

    vue+vant图片上传压缩图片大小 可能在项目中大家都会遇到文件上传的需求,比如头像,图片等,但是太大的文件上传会给服务器造成很大大压力,那么我们就需要压缩上传的文件 其实这儿所说的压缩,就是图片重 ...

  5. 解决H5 IOS手机图片上传时图片会旋转90°问题

    解决H5 IOS手机图片上传时图片会旋转90°问题 Vant 官方给出的解答需要自己解决,没有处理. 解决办法主要使用了 compressorjs 插件库 一.Vant UI库Uploader 组件图 ...

  6. ios java 图片上传到服务器,iOS 图片上传服务器

    最近搞图片上传,折腾了一个星期终于做出来了,网上搜出来的方法几乎都是好几年前的,试了好多都不能用,此次把代码公布出来供大家参考. 注:部分代码是后台写的,此方法没用到第三方库. 1.图片保存到本地同时 ...

  7. java 图片服务器 上传_Java实现把图片上传到图片服务器(nginx+vsftp)

    前言: 在我另一篇笔记中已经记载了如何用nginx + vsftp搭建图片服务器(请参考nginx + vsftp搭建图片服务器),并且用vsftp的客户端工具filezilla测试过已经可用.但是在 ...

  8. php网页中不能上传图片,为什么我的PHP图片上传代码可以实现插入数据库但图片不能插入文件夹中?...

    为什么我的PHP图片上传代码可以实现插入数据库但图片不能插入文件夹中? 关注:167  答案:4  mip版 解决时间 2021-01-19 00:58 提问者慢慢学会遗忘 2021-01-18 00 ...

  9. HTML图片上传服务器

    图片上传服务器 html <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

最新文章

  1. java中自造类是什么意思_Java建造者模式是什么?如何实现?(附代码)
  2. apache tomcat 整合
  3. python with方法
  4. 大数据平台蓝图_数据科学面试蓝图
  5. Form表单的主要Content-Type
  6. 使用ASM 4处理Java类文件–第一部分:世界,您好!
  7. php 旋转图片 保存,如何在PHP中旋转并保存图像
  8. ubuntu19.04安装pip3以及virtualenv和virtualenvwrapper
  9. 生成对抗网络 GAN 基本原理与发展历程
  10. java判断路径是否存在_科学网—Java判断文件目录以及文件是否存在 - 林清莹的博文...
  11. Wireshark、Sniffer 两款网络分析工具的比较
  12. 世界地图新西兰_世界地图新西兰的位置在哪里?新西兰与澳大利亚相隔多远?...
  13. Frida 代码提示
  14. 基于arduino的oled显示屏的使用
  15. CLIP:从自然语言监督中学习可迁移的视觉模型
  16. 服务器UDIMM、LRDIMM、RDIMM的区别
  17. 163邮箱如何登录,在哪可以登录邮箱?
  18. MSN的底层通信做的实在不怎么样!
  19. 韩顺平 2021零基础学Java 学习笔记
  20. 电子元件学习——晶闸管(可控硅)

热门文章

  1. python项目源码 日程管理软件_分享:一个开源的基于时间管理四象限的待办管理工具...
  2. 我的读书笔记 -《如何高效学习》
  3. 网络游戏封包基础 作者不明
  4. 麻将普通胡牌算法JS版(含癞子,非轮训)
  5. 车企新品牌、新车型层出,数据采集分析告诉你到底哪家强
  6. bat脚本:快速入门
  7. CRM理想关键步骤:完善客户信息分析能力
  8. Android ProgressBar 控件使用
  9. 为什么要使用 TCP keepalive?C/C++代码实现
  10. 大数据关键技术——MapReduce