From 1a0f37a2dc03bfdecb209c24b4694b486ac2a8c5 Mon Sep 17 00:00:00 2001
From: RuoYi <yzz_ivy@163.com>
Date: Thu, 24 Apr 2025 18:19:16 +0800
Subject: [PATCH] 富文本复制粘贴图片上传至url

---
 ruoyi-ui/src/components/Editor/index.vue |   49 +++++++++++++++++++++++++++++++++++++------------
 1 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/ruoyi-ui/src/components/Editor/index.vue b/ruoyi-ui/src/components/Editor/index.vue
index 89d49f3..66209ff 100644
--- a/ruoyi-ui/src/components/Editor/index.vue
+++ b/ruoyi-ui/src/components/Editor/index.vue
@@ -18,6 +18,7 @@
 </template>
 
 <script>
+import axios from "axios";
 import Quill from "quill";
 import "quill/dist/quill.core.css";
 import "quill/dist/quill.snow.css";
@@ -47,7 +48,7 @@
       type: Boolean,
       default: false,
     },
-    // 上传文件大小限制(MB)
+    /* 上传文件大小限制(MB) */
     fileSize: {
       type: Number,
       default: 5,
@@ -108,7 +109,7 @@
         if (val !== this.currentValue) {
           this.currentValue = val === null ? "" : val;
           if (this.Quill) {
-            this.Quill.pasteHTML(this.currentValue);
+            this.Quill.clipboard.dangerouslyPasteHTML(this.currentValue);
           }
         }
       },
@@ -129,15 +130,15 @@
       if (this.type == 'url') {
         let toolbar = this.Quill.getModule("toolbar");
         toolbar.addHandler("image", (value) => {
-          this.uploadType = "image";
           if (value) {
             this.$refs.upload.$children[0].$refs.input.click();
           } else {
             this.quill.format("image", false);
           }
         });
+        this.Quill.root.addEventListener('paste', this.handlePasteCapture, true);
       }
-      this.Quill.pasteHTML(this.currentValue);
+      this.Quill.clipboard.dangerouslyPasteHTML(this.currentValue);
       this.Quill.on("text-change", (delta, oldDelta, source) => {
         const html = this.$refs.editor.children[0].innerHTML;
         const text = this.Quill.getText();
@@ -158,6 +159,13 @@
     },
     // 上传前校检格式和大小
     handleBeforeUpload(file) {
+      const type = ["image/jpeg", "image/jpg", "image/png", "image/svg"];
+      const isJPG = type.includes(file.type);
+      // 检验文件格式
+      if (!isJPG) {
+        this.$message.error(`图片格式错误!`);
+        return false;
+      }
       // 校检文件大小
       if (this.fileSize) {
         const isLt = file.size / 1024 / 1024 < this.fileSize;
@@ -169,10 +177,10 @@
       return true;
     },
     handleUploadSuccess(res, file) {
-      // 获取富文本组件实例
-      let quill = this.Quill;
       // 如果上传成功
       if (res.code == 200) {
+        // 获取富文本组件实例
+        let quill = this.Quill;
         // 获取光标所在位置
         let length = quill.getSelection().index;
         // 插入图片  res.url为服务器返回的图片地址
@@ -186,8 +194,29 @@
     handleUploadError() {
       this.$message.error("图片插入失败");
     },
-  },
-};
+    // 复制粘贴图片处理
+    handlePasteCapture(e) {
+      const clipboard = e.clipboardData || window.clipboardData;
+      if (clipboard && clipboard.items) {
+        for (let i = 0; i < clipboard.items.length; i++) {
+          const item = clipboard.items[i];
+          if (item.type.indexOf('image') !== -1) {
+            e.preventDefault();
+            const file = item.getAsFile();
+            this.insertImage(file);
+          }
+        }
+      }
+    },
+    insertImage(file) {
+      const formData = new FormData();
+      formData.append("file", file);
+      axios.post(this.uploadUrl, formData, { headers: { "Content-Type": "multipart/form-data", Authorization: this.headers.Authorization } }).then(res => {
+        this.handleUploadSuccess(res.data);
+      })
+    }
+  }
+}
 </script>
 
 <style>
@@ -206,11 +235,9 @@
   content: "保存";
   padding-right: 0px;
 }
-
 .ql-snow .ql-tooltip[data-mode="video"]::before {
   content: "请输入视频地址:";
 }
-
 .ql-snow .ql-picker.ql-size .ql-picker-label::before,
 .ql-snow .ql-picker.ql-size .ql-picker-item::before {
   content: "14px";
@@ -227,7 +254,6 @@
 .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before {
   content: "32px";
 }
-
 .ql-snow .ql-picker.ql-header .ql-picker-label::before,
 .ql-snow .ql-picker.ql-header .ql-picker-item::before {
   content: "文本";
@@ -256,7 +282,6 @@
 .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
   content: "标题6";
 }
-
 .ql-snow .ql-picker.ql-font .ql-picker-label::before,
 .ql-snow .ql-picker.ql-font .ql-picker-item::before {
   content: "标准字体";

--
Gitblit v1.9.3