vue使用quill编辑器自定义附件上传方法,并根据上传附件名称生成链接

1、附件上传

需求:
在编辑器中上传word,pdf,excel等附件后,能根据上传附件的名称生成link链接,在展示页面能实现点击链接下载附件,效果图如下:
附件上传效果图实现方法:
quill编辑器自身带有link,但不满足需求,需要自定义添加一个附件上传按钮,以及修改quill中的link.js,注册到quill覆盖原来的方法,实现方法如下:

  1. 重新编辑link.ts,并重新register到quill编辑器
    • 到quill官网: https://github.com/quilljs/quill/tree/develop复制link.ts改写,link.ts目录为packages/quill/src/formats/link.ts
    • 保留原来的link方法,添加自定义link方法
      static create(value) {
          let node = undefined;
          if (value && !value.href) {
            // 自身Link Blot
            node = super.create(value);
            node.setAttribute("href", this.sanitize(value));
            node.setAttribute("rel", "noopener noreferrer");
            node.setAttribute("target", "_blank");
          } else {
            // 自定义Link Blot
            node = super.create(value.href);
            node.setAttribute("href", value.href); // 左键点击即下载
            node.setAttribute("download", value.innerText); // 左键点击即下载
            node.innerText = value.innerText;
          }
          return node;
        }
      
    • 修改后的link.js(这里我是复制link.ts粘贴到自己新建的link.js进行改写)
      import Quill from "quill";
      const InlineEmbed = Quill.import("blots/inline");
      // import Inline from '../blots/inline';
      
      // 自定义超链接
      class Link extends InlineEmbed {
        static blotName = "link";
        static tagName = "A";
        static SANITIZED_URL = "about:blank";
        static PROTOCOL_WHITELIST = ["http", "https", "mailto", "tel", "sms"];
      
        static create(value) {
          let node = undefined;
          if (value && !value.href) {
            // 自身Link Blot
            node = super.create(value);
            node.setAttribute("href", this.sanitize(value));
            node.setAttribute("rel", "noopener noreferrer");
            node.setAttribute("target", "_blank");
          } else {
            // 自定义Link Blot
            node = super.create(value.href);
            node.setAttribute("href", value.href); // 左键点击即下载
            node.setAttribute("download", value.innerText); // 左键点击即下载
            node.innerText = value.innerText;
          }
          return node;
        }
      
        static formats(domNode) {
          return domNode.getAttribute("href");
        }
      
        static sanitize(url) {
          return sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL;
        }
      
        format(name, value) {
          if (name !== this.statics.blotName || !value) {
            super.format(name, value);
          } else {
            // @ts-expect-error
            this.domNode.setAttribute("href", this.constructor.sanitize(value));
          }
        }
      }
      
      function sanitize(url, protocols) {
        const anchor = document.createElement("a");
        anchor.href = url;
        const protocol = anchor.href.slice(0, anchor.href.indexOf(":"));
        return protocols.indexOf(protocol) > -1;
      }
      
      export default Link;
      
    • 在vue中引入link.js
      import Quill from "quill";
      import Link from "./link";
      Quill.register(Link, true);
      
  2. 在quill编辑器工具栏添加自定义附件上传
    • 引入quill编辑器,添加一个el-upload用于上传(上传附件、图片、视频都使用到改组件)
      在这里插入图片描述
    • 在quill工具栏配置添加自定义附件上传按钮["uploadfile"], //自定义附件,并添加自定义附件上传功能
              modules: {
                // 工具栏配置
                toolbar: {
                  container: [
                    ["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线
                    ["blockquote", "code-block"], // 引用  代码块
                    [{ list: "ordered" }, { list: "bullet" }], // 有序、无序列表
                    [{ indent: "-1" }, { indent: "+1" }], // 缩进
                    [{ size: ["small", false, "large", "huge"] }], // 字体大小
                    [{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
                    [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
                    [{ align: [] }], // 对齐方式
                    ["clean"], // 清除文本格式
                    ["link", "image", "video"], // 链接、图片、视频
                    ["uploadfile"], //自定义附件按钮
                  ],
                  handlers: {
                    uploadfile: function (value) {
                      //自定义上传附件功能
                      _that.uploadType = "uploadfile";
                      _that.accept = "application/*";
                      setTimeout(() => {
                        if (value) {
                          document.querySelector(".el-upload input").click();
                        } else {
                          _that.quill.format("uploadfile", false);
                        }
                      }, 100);
                    },
                  },
                },
                imageResize: {
                  //放大缩小
                  displayStyles: {
                    backgroundColor: "black",
                    border: "none",
                    color: "white",
                  },
                  modules: ["Resize", "DisplaySize", "Toolbar"],
                  // Resize: 允许缩放、DisplaySize:缩放是显示像素、Toolbar:显示工具栏,用于设置图片居中等样式
                },
                // imageDrop: true, //图片拖拽
              },
      
    • 在编辑器工具栏添加自定义图标
            // 初始化时编写,
            const editor = this.$refs.editor;
            this.Quill = new Quill(editor, this.options);
            // 设置自定义工具栏图标
            this.$el.querySelector(
              ".ql-uploadfile"
            ).innerHTML = `<i class="el-icon-upload" style="font-size: 18px"/>`;
      
    • 附件上传成功后回调函数
          /** 上传成功回调函数 */
          handleUploadSuccess(res, file) {
            // 获取富文本组件实例
            let quill = this.Quill;
            // 如果上传成功
            if (res.code === 200) {
              //光标后移长度,默认是1
              let shiftLength = 1;
              // 插入链接
              quill.insertEmbed(this.lastSelection, "link", {
                href: process.env.VUE_APP_BASE_API + res.data.fileAddress,
                innerText: res.data.originalName,
              });
              this.lastSelection = res.data.originalName.length;
              // 调整光标到最后
              quill.setSelection(this.lastSelection + shiftLength);
              this.$modal.closeLoading();
            } else {
              this.$modal.closeLoading();
              this.$modal.msgError("上传失败,请重试");
            }
          },
      

3.展示效果
在这里插入图片描述
点击链接下载
在这里插入图片描述

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于vue-quill-editor的自定义上传图片,你可以按照以下步骤进行操作: 1. 首先,你需要在你的Vue项目中安装vue-quill-editor依赖包。可以使用npm或者yarn命令来安装: ```bash npm install vue-quill-editor # 或者 yarn add vue-quill-editor ``` 2. 在你需要使用vue-quill-editor的组件中引入依赖: ```vue <template> <div> <quill-editor v-model="content" :options="editorOptions" @image-added="handleImageAdded" ></quill-editor> </div> </template> <script> import { quillEditor } from 'vue-quill-editor' export default { components: { quillEditor }, data() { return { content: '', editorOptions: { // 这里可以配置其他选项 } } }, methods: { handleImageAdded(file) { // 自定义处理上传图片的逻辑 // 这里可以使用AJAX或其他方式将图片上传到服务器,然后将返回的图片地址插入到编辑器中 } } } </script> ``` 在上述代码中,我们通过`@image-added`事件监听图片添加的事件,并触发`handleImageAdded`方法来处理上传图片的逻辑。 3. 实现`handleImageAdded`方法,根据你的需求自定义上传图片的逻辑。你可以使用AJAX或其他方式将图片上传到服务器,并获取返回的图片地址。然后,你可以使用Quill提供的API将图片插入到编辑器中。下面是一个示例: ```javascript methods: { handleImageAdded(file) { const formData = new FormData() formData.append('image', file) // 发送AJAX请求将图片上传到服务器 axios.post('/upload', formData) .then(response => { const imageUrl = response.data.imageUrl // 将图片地址插入到编辑器中 const range = this.$refs.editor.quill.getSelection() this.$refs.editor.quill.insertEmbed(range.index, 'image', imageUrl) }) .catch(error => { console.error('上传图片失败', error) }) } } ``` 在上述代码中,我们通过axios库发送了一个POST请求将图片上传到服务器,并获取返回的图片地址。然后,我们使用Quill提供的`insertEmbed`方法将图片地址插入到编辑器中。 请注意,这只是一个示例,具体的上传图片逻辑可能因你的项目需求而有所不同。你需要根据自己的实际情况进行相应的修改。 希望以上信息能对你有所帮助!如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值