antd pro中vue-quilleditor富文本编辑器,重写非base64图片上传方法

本文介绍如何优化AntD Pro框架中的QuillEditor组件上传图片过程,通过重写图片上传方法解决了默认使用Base64格式上传导致的效率低下问题。

工作需要用到富文本编辑器,antdpro自带的有两个富文本编辑器,我用的是quilleditor。在上传图片的时候,图片是默认以base64格式上传的,无论是上传还是请求都非常费时,体验极差。于是想要解决这个问题,发现很多人都选择重写上传方法。
但是antd的a-upload有一个隐藏的问题
先贴上重写的方法代码

//html就是一个朴实无华的上传组件,自定义了一下upload事件
<template>
  <div :class="prefixCls">
    <a-upload list-type="picture" v-show="false" :customRequest="uploadimg">
      <a-button> <a-icon type="upload" /> upload </a-button>
    </a-upload>

    <quill-editor
      v-model="content"
      ref="myQuillEditor"
      :options="editorOption"
      @blur="onEditorBlur($event)"
      @focus="onEditorFocus($event)"
      @ready="onEditorReady($event)"
      @change="onEditorChange($event)"
    >
    </quill-editor>
  </div>
</template>
//由于需要重写tabbar 中header图片的上传事件,图片重写又在tabbar中,没办法只能重新定义工具栏
modules: {
          toolbar: {
            container: [
              // 工具栏配置
              ['bold'],
              ['italic'],
              ['underline'],
              ['strike'],
              [{ header: 1 }, { header: 2 }],
              [{ list: 'ordered' }, { list: 'bullet' }],
              [{ align: [] }],
              [{ header: [1, 2, 3, 4, 5, 6, !1] }],
              //    ['blockquote'], ['code-block'],//不需要的可以干掉
              ['image'],
              [{ list: 'ordered' }, { list: 'bullet' }],
              [{ direction: 'rtl' }]
            ],
            handlers: {
              image: function(value) {
                if (value) {
                  // 获取到antd的upload框选择图片的弹出框事件并触发一次点击
                  document.querySelector('.ant-upload .ant-btn').click()
                } else {
                //禁用quill自带的image时间
                  this.quill.format('image', false)
                }
              }
            }
          }
        }
 uploadimg(data) {
      const formData = new FormData()
      formData.append('file', data.file)
      console.log(formData)
      uploadimg(formData).then(res => {
        data.onSuccess(res, data.file)
        this.url = res.url
        //console.log(this.url)
		//以上是普通的上传方法代码,吧后台返回的url拿到就行了
		
		//这一步是获取quilleditor的实例
        let quill = this.$refs.myQuillEditor.quill
        
        // 获取光标所在位置
        let length = quill.getSelection().index
        if (res) {
          console.log(length)
          // 插入图片  res为服务器返回的图片地址
          quill.insertEmbed(length, 'image', this.url)
          // 调整光标到最后
          quill.setSelection(length + 1)
          this.$message.success('上传成功')
        } else if (res.file.status === 'error') {
          this.$message.error('图片插入失败')
        }
      })
    },

自此,重写的图片上传方法就完成了。
注意,我之前提到了一个隐藏的问题
刚开始我是把 获取光标以下的代码写在了a-upload组件的change方法里,但是后来发现每次都会触发两次change,百思不得其解,仔细读了文档发现,上传和完成,失败都会触发change回调,这才反应过来我的这些代码应该写在uploadimg方法里。果断吧@change删掉,恶心了我一天,吐了在这里插入图片描述

### 集成 Quill 富文本编辑器与 Ant Design Vue 实现自定义图片上传 为了实现在 `Quill` 富文本编辑器中集成 `Ant Design Vue` 并实现自定义图片上传功能,可以按照如下方式构建解决方案。 #### 安装依赖库 首先需要安装必要的依赖包来支持富文本编辑以及图片上传的功能。这包括 `vue-quill-editor` 和 `ant-design-vue` 的安装: ```bash npm install ant-design-vue vue-quill-editor axios --save ``` #### 创建图片上传模块 创建一个新的组件用于处理图片上传逻辑,并将其集成到现有的 `Quill` 编辑器实例中。此部分主要涉及使用 `Ant Design Vue` 提供的 `Upload` 组件来进行文件选择和提交操作[^2]。 #### 修改 main.js 文件配置全局注册插件 确保已经在项目的入口文件 `main.js` 中正确引入并初始化了所需的插件和服务: ```javascript import { createApp } from 'vue'; import App from './App.vue'; // 引入 quill editor 及样式 import VueQuillEditor from 'vue-quill-editor' import 'quill/dist/quill.core.css' import 'quill/dist/quill.snow.css' import 'quill/dist/quill.bubble.css' const app = createApp(App); app.use(VueQuillEditor); // 使用 quill editor 插件 app.mount('#app'); ``` #### 自定义工具栏按钮以触发图片上传流程 为了让用户能够方便地向文档中插入来自服务器的新图片资源,可以在 `Quill` 工具条里添加一个专门用来打开文件对话框的选择项。当点击该图标时会弹出由 `Ant Design Vue` 渲染出来的标准文件输入控件[^3]。 #### 处理上传事件并将返回的结果作为 URL 插入到编辑区 一旦选择了要上传的照片之后,则需调用相应的 API 接口完成实际的数据输过程;成功后获取远程地址信息并通过编程手段注入到当前光标的所在位置处形成完整的 HTML img 标签结构[^4]。 下面给出一段简化版代码片段展示上述思路的具体实践方法: ```html <template> <div id="editor-container"> <!-- ... --> <a-upload name="file" list-type="picture-card" :show-upload-list="false" @change="handleChange" action="/your-server-side-api-endpoint"> <button type="primary">Select File</button> </a-upload> <quill-editor ref="myTextEditor"></quill-editor> <!-- ... --> </div> </template> <script setup lang="ts"> import { ref, onMounted } from "vue"; import { message } from 'ant-design-vue'; let myTextEditor = ref(null); function handleChange(info) { const status = info.file.status; if (status === 'uploading') { console.log('Uploading...'); return; } if (status === 'done') { handleImageAdded(info.file.response.url); } else if (status === 'error') { message.error(`${info.file.name} file upload failed.`); } } async function handleImageAdded(url){ let range = this.$refs.myTextEditor.quill.getSelection(); this.$refs.myTextEditor.quill.insertEmbed(range.index,'image', url); } </script> ``` 这段代码展示了如何结合 `Ant Design Vue` 的 `A-UPLOAD` 组件与 `Vue-Quill-Editor` 来实现简单的图片上传机制。需要注意的是这里的 `/your-server-side-api-endpoint` 应替换为你自己的服务端接口地址以便接收客户端发送过来的实际二进制数据流。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值