当前位置: 首页 > news >正文

Vue3使用富文本编辑器vue-quill 自定义图片上传、文件上传

一、引入依赖

// npm install @vueup/vue-quill@^1.2.0 quill@^1.3.7

"@vueup/vue-quill": "^1.2.0",
 "quill": "^1.3.7",

二、在vue文件中使用

<templete>

 <div class="editor-container" v-if="show">
        <QuillEditor v-model:content="formData.CONT" contentType="html"              
         :options="editorOptions"  @ready="onEditorReady"  />
</div>
  

</templete>
<script setup>
    import { ref, watch, defineProps } from "vue";
    import { QuillEditor } from '@vueup/vue-quill';
    import '@vueup/vue-quill/dist/vue-quill.snow.css';
     const formData = ref({
        id:null,
        CONT: null
    });
    const editorOptions = {
       modules: {
          toolbar: [
              ['bold', 'italic', 'underline', 'strike'],
              ['blockquote', 'code-block'],
              ['image','link'],  // 自定义图片上传、文件上传
              [{ 'header': 1 }, { 'header': 2 }],
              [{ 'list': 'ordered'}, { 'list': 'bullet' }],
              [{ 'script': 'sub'},{ 'script': 'super' }],
          ]
      }
    }



    // 用于存储 Quill 实例
    let quillInstance = null;

    // 图片上传处理函数
    const handleImageUpload = () => {
      const input = document.createElement('input');
      input.type = 'file';
      input.accept = 'image/*';
      input.click();

      input.onchange = async (e) => {
        console.log('图片图片',e);
        const file = e.target.files[0];
        if (file) {
          try {
            // 上传图片axios
            const response = await uploadImg(file);
            const imageUrl = response.data; 
            insertImageToEditor(imageUrl);
          } catch (error) {
            console.error('图片上传失败', error);
          }
        }
      };
    };

// 文件上传处理函数
    const handleFileUpload = () => {
      const input = document.createElement('input');
      input.type = 'file';
      input.accept = '*/*'; // 接受所有类型的文件 .docx,.pdf
      input.click();

      input.onchange = async (e) => {
        const file = e.target.files[0];
        if (file) {
          const maxSize = 10 * 1024 * 1024; // 10MB
          if (file.size > maxSize) {
            toast(t('sys.file-error-msg'), 'error');
            return;
          }
          try {
            const response = await uploadFile(file);
            const fileUrl = response.data.url; // 假设返回的文件 URL 在 response.data
            insertFileToEditor(fileUrl, file.name); // 插入文件链接到编辑器
          } catch (error) {
            console.error('文件上传失败', error);
          }
        }
      };
    };

    // 将上传的图片插入编辑器
    const insertImageToEditor = (imageUrl) => {
      if (quillInstance) {
        const range = quillInstance.getSelection();
        quillInstance.insertEmbed(range.index, 'image', imageUrl);
      }
    };

// 将上传的文件插入编辑器
     const insertFileToEditor = (fileUrl, fileName) => {
      if (quillInstance) {
        const range = quillInstance.getSelection();
        const link = `<a href="${fileUrl}" target="_blank">${fileName}</a>`;
        quillInstance.clipboard.dangerouslyPasteHTML(range.index, link); // 插入文件链接
      }
    };

    // 在编辑器准备好后,获取 Quill 实例
    const onEditorReady = (quill) => {
      quillInstance = quill; // 保存 quill 实例
      const toolbar = quill.getModule('toolbar');
      toolbar.addHandler('image', handleImageUpload); // 替换默认的图片上传行为
      toolbar.addHandler('link', handleFileUpload); // 添加自定义文件上传处理
    };
 </script>
  
  <style scoped>
   .editor-container {
        width: 100%;
        max-height: 100%;
        overflow-y: auto;
        border: 1px solid #d8d8d8;
    }

  </style>

三、axios.js

import axios from '~/axios'

// 上传图片
export function uploadImg(file) {
    const formData = new FormData();
    formData.append('file', file);
     return axios.post("/upload/img", formData, {
      headers: {
        'Content-Type': 'multipart/form-data'
      }
  });
}


export function uploadFile(file) {
    const formData = new FormData();
    formData.append('file', file);
     return axios.post("/upload/file", formData, {
      headers: {
        'Content-Type': 'multipart/form-data'
      }
  });
}

http://www.dtcms.com/a/112275.html

相关文章:

  • 数据库——MySQL数字函数和子查询
  • 交互式 AI 系统
  • C++ 极简常用内容
  • 电商---part02 项目环境准备
  • 如何根据电池电流计算电池容量
  • wsl编译openwrt24.10.0
  • dbscan 检测噪声
  • Node.js中间件的5个注意事项
  • 【Java集合】单列集合List详解
  • 基于K8s的演示用单机ML服务部署
  • 26考研——线性表_ 线性表的链式表示_双循环链表(2)
  • 多表查询的多与一
  • 对 Python Websockets 库全方位详解
  • 企业安全——FIPs
  • 面试可能会遇到的问题回答(嵌入式软件开发部分)
  • 如何在 Windows 上安装 Python
  • 新旧iPhone相册复制 - 相册图片视频对拷 - 换机 - 迁移设备数据 - 免费开源爱思助手
  • 免费在线MBTI性格测试工具 - 探索你的性格特质
  • 什么是自动化测试框架?常用的自动化测试框架有哪些?
  • 2.3 MySQL基本内置函数
  • Cortex-M​ 函数调用的入栈与出栈操作
  • 【5】搭建k8s集群系列(二进制部署)之安装master节点组件(kube-controller-manager)
  • 盲盒小程序开发平台搭建:打造个性化、高互动性的娱乐消费新体验
  • 定长池的实现
  • 蓝桥杯 小明的背包1 小兰的神秘礼物 01背包问题 模板 C++
  • 财务税务域——企业税务系统设计
  • centos8上实现lvs集群负载均衡dr模式
  • 【学Rust写CAD】23 渐变效果(gradient_source.rs)
  • 【面试篇】Dubbo
  • NSSCTF [HGAME 2023 week1]simple_shellcode