解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题

解决vue-quill-editor上传内容中图片base64字符串过长的问题,有以下几种方式:

1. 使用quill-image-extend-module

quill-image-extend-module是一个扩展模块,它可以让quill-editor支持图片上传。它会将上传的图片文件转换成base64格式,然后插入到编辑器内容中,这会导致编辑器内容变得过长。为了解决这个问题,我们可以通过修改源代码的方式来实现。

步骤:

  1. 安装quill-image-extend-module
npm install quill-image-extend-module --save
  1. 修改代码,引入quill-image-extend-module,并且在quill-editor创建前初始化该模块,然后在图片上传时将base64字符串转换成blob格式。代码示例:
<template>
  <quill-editor v-model="content" ref="editorRef" />
</template>

<script>
import Quill from "quill";
import ImageExtend from "quill-image-extend-module";
import "quill/dist/quill.core.css";
import "quill/dist/quill.snow.css";
import "quill/dist/quill.bubble.css";

export default {
  name: "editor",
  data() {
    return {
      content: "",
    };
  },
  mounted() {
    this.initEditor();
  },
  methods: {
    initEditor() {
      let options = {
        modules: {
          toolbar: [
            ["bold", "italic", "underline", "strike"], // toggled buttons
            ["blockquote", "code-block"],
            [{ header: 1 }, { header: 2 }], // custom button values
            [{ list: "ordered" }, { list: "bullet" }],
            [{ script: "sub" }, { script: "super" }], // superscript/subscript
            [{ indent: "-1" }, { indent: "+1" }], // outdent/indent
            [{ direction: "rtl" }], // text direction
            [{ size: ["small", false, "large", "huge"] }], // custom dropdown
            [{ header: [1, 2, 3, 4, 5, 6, false] }],
            [{ color: [] }, { background: [] }], // dropdown with defaults from theme
            [{ font: [] }],
            [{ align: [] }],
            ["link", "image", "video"],
            ["clean"], // remove formatting button
          ],
        },
        theme: "snow",
        placeholder: "请输入内容",
      };
      Quill.register("modules/imageExtend", ImageExtend);
      this.editor = new Quill(this.$refs.editorRef.$el, options);
      this.editor.getModule("toolbar").addHandler("image", this.selectLocalImage);
    },
    selectLocalImage() {
      const input = document.createElement("input");
      input.setAttribute("type", "file");
      input.click();

      // Listen upload local image and save to server
      input.onchange = () => {
        const file = input.files[0];

        let formData = new FormData();
        formData.append("file", file);

        let xhr = new XMLHttpRequest();
        xhr.open("POST", "/api/upload/image", true);
        xhr.setRequestHeader("Authorization", "Bearer " + getAccessToken());
        xhr.onload = (e) => {
          if (xhr.status === 200 && xhr.readyState === 4) {
            let url = JSON.parse(xhr.responseText).url;
            const range = this.editor.getSelection(true);
            this.editor.insertEmbed(range.index, "image", url);
          }
        };
        xhr.send(formData);
      };
    },
  },
};
</script>

2. 使用外部图片服务器

另外一种方式是使用外部图片服务器,将图片上传到指定的图片服务器上,然后在编辑器中插入图片的时候,使用图片的URL地址即可。这种方法不需要将base64字符串插入到编辑器内容中,所以编辑器内容不会过长。

示例:

在html中使用编辑器:

<template>
  <quill-editor v-model="content" ref="editorRef" />
</template>

<script>
import Quill from "quill";
import "quill/dist/quill.core.css";
import "quill/dist/quill.snow.css";
import "quill/dist/quill.bubble.css";

export default {
  name: "editor",
  data() {
    return {
      content: "",
    };
  },
  mounted() {
    this.initEditor();
  },
  methods: {
    initEditor() {
      let options = {
        modules: {
          toolbar: [
            ["bold", "italic", "underline", "strike"], // toggled buttons
            ["blockquote", "code-block"],
            [{ header: 1 }, { header: 2 }], // custom button values
            [{ list: "ordered" }, { list: "bullet" }],
            [{ script: "sub" }, { script: "super" }], // superscript/subscript
            [{ indent: "-1" }, { indent: "+1" }], // outdent/indent
            [{ direction: "rtl" }], // text direction
            [{ size: ["small", false, "large", "huge"] }], // custom dropdown
            [{ header: [1, 2, 3, 4, 5, 6, false] }],
            [{ color: [] }, { background: [] }], // dropdown with defaults from theme
            [{ font: [] }],
            [{ align: [] }],
            ["link", "image", "video"],
            ["clean"], // remove formatting button
          ],
        },
        theme: "snow",
        placeholder: "请输入内容",
      };
      this.editor = new Quill(this.$refs.editorRef.$el, options);
    },
  },
};
</script>

在上传图片的接口中,将上传的图片保存到外部图片服务器中,并返回图片的URL地址。

const axios = require("axios");
const FormData = require("form-data");

async function uploadImageToFtp(req, res, next) {
  try {
    const formData = new FormData();
    formData.append("file", req.file.buffer, req.file.originalname);

    const { data: { url } } = await axios.post("http://外部图片服务器地址", formData, {
      headers: {
        ...formData.getHeaders(),
        Authorization: `Bearer ${req.headers.authorization}`,
      },
    });

    res.send({ url });
  } catch (err) {
    next(err);
  }
}

module.exports = { uploadImageToFtp };

在插入图片的时候,将图片的URL地址作为参数进行插入。

const range = this.editor.getSelection();
this.editor.insertEmbed(range.index, "image", url);

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • vue使用file-saver本地文件导出功能

    下面我将为您详细讲解如何使用 Vue 和 file-saver 库实现本地文件导出功能。 1. 安装 file-saver 首先需要安装 file-saver,可以使用 npm 安装,命令如下: npm install file-saver –save 2. 使用 file-saver 在需要使用的 Vue 组件中引入 file-saver: import…

    Vue 2023年5月27日
    00
  • Vue watch中监听值的变化,判断后修改值方式

    当需要在Vue组件中监听某个特定数据的变化时,就需要用到Vue的watch功能。下面,我将为您详细讲解“Vue watch中监听值的变化,判断后修改值方式”的完整攻略。 监听数据变化 使用Vue的watch功能时,我们可以在组件中使用$watch来监听特定数据的变化,并在数据变化时执行相应的逻辑操作。 下面是一个示例,我们监听一个数据值dataValue的变…

    Vue 2023年5月27日
    00
  • vue中render函数的使用详解

    “Vue中Render函数的使用详解”可以帮助初学Vue的开发者更深入了解Vue的模板编译和渲染机制,帮助理解Vue的核心概念和工作原理。 Render函数的基本概念 Render函数是Vue组件中最核心的概念之一,它用于生成组件的虚拟DOM树。Vue官方文档中对Render函数的定义是:渲染函数是一个返回虚拟节点的函数,基于状态渲染出组件 UI。 在Vue…

    Vue 2023年5月27日
    00
  • vue.js动画中的js钩子函数的实现

    Vue.js动画中的JS钩子函数的实现 Vue.js提供了一套完整的动画系统,使得开发者能够轻易地实现各种动态效果。在Vue.js中,动画通过CSS、JavaScript或Web动画API实现。而动画所需要的具体动作则由JS钩子函数来掌控。 动画钩子函数 Vue.js为我们提供了一个允许我们在动画特定阶段添加自定义逻辑的钩子函数全家桶。以下是一些主要的动画钩…

    Vue 2023年5月28日
    00
  • 手把手带你安装vue-cli并创建第一个vue-cli应用程序

    下面我将为您详细讲解如何安装vue-cli并创建第一个vue-cli应用程序的完整攻略。 1. 安装Node.js和npm 首先,您需要在您的电脑上安装Node.js和npm。如果您已经安装了,请跳过这一步。 您可以在Node.js的官方网站下载适合您操作系统的安装包,并按照提示进行安装。 2. 安装Vue CLI Vue CLI是一个基于Vue.js的快速…

    Vue 2023年5月27日
    00
  • Vue内部渲染视图的方法

    下面是关于 Vue 内部渲染视图的方法的详细攻略。 什么是 Vue 内部渲染视图的方法 在 Vue 中,当数据发生变化时,会根据使用的渲染方法重新渲染视图,从而使视图与数据状态保持同步。Vue 内部提供了多种渲染视图的方法,包括基于模板的渲染、基于 JSX 的渲染、手动刷新等。 Vue 模板渲染 Vue 的模板渲染是利用 HTML 模板代码和 Vue 组件选…

    Vue 2023年5月27日
    00
  • vue watch关于对象内的属性监听

    Vue.js 是一款轻量级的MVVM框架,提供了非常方便的API用于响应用户操作,其中watch就是其中非常重要的一部分,用于实现数据的监听,从而对数据的变化做出响应。 当需要监听对象内部属性时,可以使用深度监听,即使用deep:true选项,Vue会递归地监听对象以及对象内的所有属性变化。下面提供两个示例说明。 示例1 在模板中有一个输入框和一个按钮,当按…

    Vue 2023年5月28日
    00
  • Vue.js render方法使用详解

    下面是”Vue.js render方法使用详解”的完整攻略: 一、render方法是什么 render方法是Vue.js中非常重要的一个方法,在Vue.js内部也是经常被使用的。它是用来创建Vue.js中的虚拟DOM树,并最终根据这棵虚拟DOM树生成真正的DOM树。使用render方法可以获得更加精细的DOM操作控制权,从而实现更高级的交互和性能优化。 使用…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部