解决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 v-model表单数据双向绑定完整示例

    下面我来详细讲解“Vue v-model表单数据双向绑定完整示例”的完整攻略。 1. 简介 v-model是Vue中非常重要的一个指令,它可以实现表单数据的双向绑定。在Vue中,数据驱动视图,当我们的数据发生变化时,视图也会随之变化,而v-model就是连接数据和视图的重要途径之一。 2. 示例说明 下面我们来看两个关于v-model的示例: 2.1 示例1…

    Vue 2023年5月27日
    00
  • Vite3迁移Webpack5的实现

    关于“Vite3迁移Webpack5的实现”的完整攻略,我将会从以下几个方面进行详细讲解: 什么是Vite3和Webpack5? 为什么要迁移Vite3到Webpack5? Vite3迁移Webpack5的实现步骤 示例说明 1. 什么是Vite3和Webpack5? Vite3是一个基于ESM的快速开发构建工具,专注于提供基于浏览器原生ES模块系统的开发体…

    Vue 2023年5月28日
    00
  • Vue CLI 3.x 自动部署项目至服务器的方法

    这里我为大家讲解如何使用Vue CLI 3.x自动部署项目至服务器的详细步骤。 什么是Vue CLI 3.x自动部署? Vue CLI 3.x自动部署是指通过Vue CLI 3.x提供的自动化工具,将项目自动部署到远程服务器上。使用起来相当方便快捷,可以极大地提高团队的开发效率。 准备工作 在使用Vue CLI 3.x自动部署功能之前,需要先安装好以下软件:…

    Vue 2023年5月28日
    00
  • 详解如何在vue项目中使用lodop打印插件

    下面是详解如何在vue项目中使用lodop打印插件的完整攻略: 步骤一:下载并安装Lodop插件 下载Lodop打印插件的安装包 安装Lodop打印插件,安装完成后,可以在浏览器的扩展中看到Lodop打印插件 步骤二:在vue项目中使用Lodop插件 使用npm安装lodop-printer npm install –save lodop-printer …

    Vue 2023年5月27日
    00
  • 详解Vue CLI 3.0脚手架如何mock数据

    具体来说,要讲解如何在Vue CLI 3.0脚手架中使用mock数据,我们需要以下内容: 确定如何安装和使用Vue CLI 3.0,以及搭建本地开发环境。 介绍如何使用Mock.js模拟数据,并在Vue项目中引入。 在Vue脚手架项目中,讲解如何开启和使用webpack-dev-server的proxy功能,和结合Mock.js进行数据模拟。 通过具体的示例…

    Vue 2023年5月28日
    00
  • Vue实现万年日历的示例详解

    下面是“Vue实现万年日历的示例详解”的完整攻略。 什么是万年日历? 万年历是一种用于了解日期和节气变化的工具。它可以显示某一年的每个月份的日历,同时也可以显示节气和一些重要的农历节日。在日常生活中,万年历常常被用于查询特定日期的星期几、农历日期等信息。 如何使用Vue实现万年日历? 以下是使用Vue实现万年日历的步骤: 第一步:创建Vue应用程序 在htm…

    Vue 2023年5月29日
    00
  • node+vue实现文件上传功能

    下面我将为您详细讲解“node+vue实现文件上传功能”的完整攻略。 技术实现方案 实现文件上传功能需要前后端协同完成,一般采用以下技术方案: 前端:Vue + element-ui 后端:Node.js + Express 存储:阿里云 OSS 或者本地文件系统 前端实现 准备工作 1.在项目中引入 element-ui 和 axios npm insta…

    Vue 2023年5月28日
    00
  • webpack4手动搭建Vue开发环境实现todoList项目的方法

    下面是“webpack4手动搭建Vue开发环境实现todoList项目的方法”的完整攻略。 步骤一:初始化项目 先创建一个新的文件夹,进入文件夹中进行以下操作: 1.使用npm初始化项目: npm init 根据提示输入项目信息。 2.安装webpack和webpack-cli: npm install webpack webpack-cli –save-…

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