el-upload实现复制粘贴图片

news2024/11/24 2:34:23

前言:

在之前的项目中,利用`el-upload`实现了上传图片视频的预览。项目上线后,经使用人员反馈,上传图片、视频每次要先保存到本地然后再上传,很是浪费时间,公司客服人员时间又很紧迫(因为要响应下一位客户的咨询),所以想直接复制图片到表单中,实现自动上传。OK,需求就是这么来得,下面是实现过程。

要上传图片,肯定要先拿到图片的信息,比如图片url、base64、大小、名称等等。那复制时怎么拿图片信息呢?

本文中使用了富文本编辑器来实现图片的复制粘贴功能,我们也可以通过监听鼠标的复制粘贴事件来实现。

使用的富文本编辑器:快速开始 | wangEditor

1、安装富文本编辑器

npm install @wangeditor/editor --save

npm install @wangeditor/editor-for-vue --save

2、引入组件

import { Editor, Toolbar } from '@wangeditor/editor-for-vue'

3、使用组件

视图:

<el-form-item label="上传图片" class="myUpload">
        <div slot="label" style="display:block;">
          上传图片
          <span style="color:#999999;">(最多10张,单张不能超过10M)</span>
        </div>
        <div style="margin:1px 0 10px;border: 1px solid #ccc;display:inline-block;">
          /*引用组件*/
          <Toolbar
            :editor="editor"
            :default-config="toolbarConfig"
            :mode="mode"
            style="visibility: hidden;height:0; border-bottom: 1px solid #ccc"
          />
          /*引用组件*/
          <Editor
            id="wangEditor"
            v-model="html"
            :default-config="editorConfig"
            :mode="mode"
            style="height: 45px; overflow-y: hidden;"
            @onCreated="onCreated"
          />
        </div>
        <el-upload
          :auto-upload="false"
          :limit="10"
          :file-list="imageList"
          action="#"
          disabled
          accept=".jpg,.jpeg,.png,.mp4"
          list-type="picture-card"
        >
          <i slot="default" class="el-icon-plus"></i>
          <div slot="file" slot-scope="{ file }">
            <img :src="file.url" class="el-upload-list__item-thumbnail" alt="" />
            <div class="el-upload-list__item-actions">
              <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
                <i class="el-icon-zoom-in"></i>
              </span>
              <span class="el-upload-list__item-delete" @click="handleRemoveImg(file)">
                <i class="el-icon-delete"></i>
              </span>
            </div>
          </div>
        </el-upload>
      </el-form-item>

1、根据自己需要添加样式

2、`style="visibility: hidden;height:0; border-bottom: 1px solid #ccc"`隐藏富文本工具栏,我们只是复制图片,用不到工具栏

 JS:

created() {
    const that = this
    const api = process.env.NODE_ENV === 'production' ? 'https://生产' : 'http://测试'
    // 配置图片上传,要在此处配置,编辑器创建以后,再赋值就不起作用了
    this.editorConfig.MENU_CONF['uploadImage'] = {
      server: api + '/summary/upload',
      // form-data fieldName ,默认值 'wangeditor-uploaded-image'
      fieldName: 'file',
      // 单个文件的最大体积限制,默认为 2M
      maxFileSize: 10 * 1024 * 1024,
      // 最多可上传几个文件,默认为 100
      maxNumberOfFiles: 10,
      // 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 []
      allowedFileTypes: ['image/*'],
      // 小于该值就插入 base64 格式(而不上传),默认为 0
      base64LimitSize: 10 * 1024 * 1024,

      // 自定义增加 http  header
      headers: {
        'Admin-Token': Lockr.get('Admin-Token')
      },

      // 超时时间,默认为 10 秒
      timeout: 60 * 1000,

      // 上传之前处触发
      onBeforeUpload(file) {
        const fileObj = Object.values(file)[0].data
        console.log('fileObj:', fileObj)
        const isJPG = fileObj.type == 'image/jpg' || fileObj.type == 'image/jpeg' || fileObj.type == 'image/png'
        if (!isJPG) {
          that.$message.error('图片只能是 JPG、GIF、PNG 格式!')
          return false
        }
      },
      // 文件上传失败
      onFailed(file, res) {
        console.log(`${file.name} 上传失败`, res)
      },
      // 文件上传成功之后
      onSuccess(file, res) {
        console.log(`${file.name} 上传成功`, res)
      }
      // 上传成功自动插入
      // customInsert(res, insertFn) {
      // console.log('res:', res)
      // 从 res 中找到 url  ,然后插入图片
      // insertFn(res.url)
      // }
    }

    // 插入图片后执行(base64格式会自动插入)
    this.editorConfig.MENU_CONF['insertImage'] = {
      onInsertedImage(imageNode) {
        console.log('node:', imageNode)
        if (imageNode == null) return
        const { alt, src } = imageNode
        const obj = {
          name: alt,
          fileBase64: src,
          url: src
        }
        that.imageList.push(obj)

        if (that.imageList.length > 10) {
          that.imageList = that.imageList.splice(0, 10)
        }

        that.editor.setHtml('<div></div>')
      }
    }

    this.editorConfig.hoverbarKeys = {
      image: {
        // 配置 image 元素的 hoverbar
        menuKeys: ['imageWidth30', 'imageWidth100', 'deleteImage']
      }
    }
  },
  
  methods:{
     // 初始化编辑器
    onCreated(editor) {
      console.log('初始化编辑器')
      this.editor = Object.seal(editor)
      if (this.editor && !this.detail) {
        // this.editor.setHtml('<div></div>')
      }
    },

    // 移除图片文件
    handleRemoveImg(file) {
      this.imageList.map((item, index) => {
        if (item.name === file.name) {
          // 全量编辑表单时
          if (item.type === 2) {
            item.type = 1 // 2 保留 1 删除
            this.newImgList = this.imageList.splice(index, 1)
          } else {
            // 新增图片时
            this.imageList.splice(index, 1)
          }
        }
      })
    },

    // 预览图片
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url
      this.$alert(`<img src="${this.dialogImageUrl}" width="100%">`, {
        dangerouslyUseHTMLString: true,
        callback: () => {}
      })
    },

  }

1、初始化富文本编辑器

2、默认配置一定要写在`created()`生命周期里,否则初始化时会检测不到

3、上面代码中虽然配置了上传图片API,但是没有用到,因为图片默认使用了`base64格式`而不上传

4、因为没有使用图片上传,所以上传相关的事件没有触发

5、使用`base64`格式插入图片后,会触发`onInsertedImage`事件

6、默认配置时可以设置一个空`div`,解决样式问题

​​​​​​详情参考:菜单配置 | wangEditor开源 Web 富文本编辑器,开箱即用,配置简单icon-default.png?t=N7T8https://www.wangeditor.com/v5/menu-config.html#%E5%9B%BE%E7%89%87

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1043494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xmake v2.8.3 发布,改进 Wasm 并支持 Xmake 源码调试

Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量&#xff0c;没有任何依赖&#xff0c;因为它内置了 Lua 运行时。 它使用 xmake.lua 维护项目构建&#xff0c;相比 makefile/CMakeLists.txt&#xff0c;配置语法更加简洁直观&#xff0c;对新手非常友好&#x…

描述性统计分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件可在个人主页—…

电脑D盘格式化会有什么影响?电脑D盘格式化了怎么恢复数据

当电脑出现问题时&#xff0c;往往会出现一些提示&#xff0c;例如提示格式化的问题&#xff0c;而最近有位小伙伴也遇到了相似的问题&#xff0c;即D盘一打开就显示格式化&#xff0c;由于不清楚D盘格式化会有什么影响&#xff0c;因此不小心进行了格式化操作&#xff0c;结果…

较真儿学源码系列-PowerJob启动流程源码分析

PowerJob版本&#xff1a;4.3.2-main。 1 简介 PowerJob是全新一代的分布式任务调度与计算框架&#xff0c;官网地址&#xff1a;http://www.powerjob.tech/。其中介绍了PowerJob的功能特点&#xff0c;以及与其他调度框架的对比&#xff0c;这里就不再赘述了。 以上是PowerJob…

基于PSO算法的功率角摆动曲线优化研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MySQL的执行流程

在聊mysql的执行流程之前&#xff0c;咱们要先聊聊mysql的逻辑架构。 逻辑架构 可以将上图简化为下图 连接层 客服端访问mysql服务器前&#xff0c;要先和mysq建立tcp连接。经过3次握手建立连接成功后&#xff0c;mysql服务器对tcp传输过来的账号密码进行身份认证&#x…

接口测试之文件下载

在工作中对于下载接口&#xff0c;经常会有这样的疑问&#xff1a;这类接口一般功能比较稳定&#xff0c;但是又比较重要&#xff0c;需要占用回归测试时间&#xff0c;有没有可替代的方式&#xff1f; 答案肯定是有的&#xff0c;可以从接口测试/UI自动化测试介入&#xff0c;…

UE5 虚幻引擎 使用编辑器工具进行资产批处理操作 让你的工作效率指数级增长!!!

目录 0 引言1 编辑器工具蓝图1.1 介绍1.2 案例&#xff1a;批量设置静态网格体资产的LOD1.3 进阶用法 2 编辑器工具控件2.1 介绍2.2 案例&#xff1a;随机给场景中Actor添加Yaw旋转值 0 引言 官方教程视频 参考文章 参考视频 UE5提供了两种 编辑器工具 &#xff1a;编辑器工具…

Dubbo学习(二)——dubbo环境搭建

文章目录 dubbo核心简介SpringCloud与Dubbo的区别Dubbo的架构说明dubbo和Feign远程调用的差异共同点&#xff1a;区别&#xff1a; 基于 Spring Boot 开发微服务应用项目介绍1. 启动注册中心2. 新建一个spring boot项目3. 添加 Maven 依赖4. 定义服务接口5. 定义服务端的实现实…

操作系统 --- 进程的描述与控制

&#xff08;一 &#xff09;前趋图和程序的执行 前趋图 前趋图 :有向无循环图 &#xff0c;用于描述 进程之间执行的先后顺序 结点表示进程或程序段&#xff0c;有向边表示前趋关系 前驱图中是不允许有循环的&#xff0c;否则必然会产生无法实现的前驱关系。 &#xff08;二…

浙大公共管理硕士(MPA)提前批面试的题库里到底有哪些内容?

像研究生招生这样严肃的工作&#xff0c;所有的环节和程序都得有章可循&#xff01;浙大公共管理硕士&#xff08;MPA&#xff09;项目提前批面试即将在10月14日举行&#xff0c;已经通过材料审核的考生肯定很想知道面试中会遇到什么样的题目&#xff0c;专注浙大的杭州达立易考…

卤制品配送经营商城小程序的用处是什么

卤制品也是食品领域重要的分支&#xff0c;尤其对年轻人来说&#xff0c;只要干净卫生好吃价格合理&#xff0c;那复购率宣传性自是不用说&#xff0c;而随着互联网发展&#xff0c;传统线下门店也须要通过线上破解难题或进一步扩大生意。 而商城小程序无疑是商家通过线上私域…

Redis各数据类型特定的命令和用法 1.0版本

目录 一、Sring数据类型1.1 概述1.2 set/get/append/strlen命令1.3 incr/decr/incrby/decrby 命令1.4 getset命令1.5 setex命令1.6 setnx命令1.7 mset/mget/msetnx命令 二、List数据类型2.1 概述2.2 lpush/lpushx/lrange命令2.3 lpop/llen命令2.4 lrem/lset/lindex/ltrim命令2.…

信息安全:网络安全审计技术原理与应用.

信息安全&#xff1a;网络安全审计技术原理与应用. 网络安全审计是指对网络信息系统的安全相关活动信息进行获取、记录、存储、分析和利用的工作。网络安全审计的作用在千建立“事后“安全保障措施&#xff0c;保存网络安全事件及行为信息&#xff0c;为网络安全事件分析提供线…

SpringBoot之视图解析

文章目录 前言一、视图解析1.视图解析原理流程 二、模板引擎——Thymeleaf基本语法表达式字面量文本操作数学运算布尔运算比较运算条件运算特殊操作设置属性值-th:attr迭代条件运算属性优先级 提取公共页面th:insertth:replace区别 总结 前言 SpringBoot默认不支持 JSP&#x…

UE学习记录07----C++中使用事件委托

1.c定义多播委托&#xff0c;示例代码&#xff1a; #include "Delegates/Delegate.h"DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMyDelegate, UObject*, SelectAgent);/****/ UCLASS(Blueprintable, DisplayName "VM_PlaceEntity") class PR_PLACEE…

“益路同行”栏目人物专访第0001期—笨爸爸工房创始人张旭健先生

中国善网在第十届慈展会上特别推出了《益路同行》采访栏目&#xff0c;《益路同行》栏目旨在寻觅公益之路上同行者的故事&#xff0c;挖掘公益更深层次的内涵&#xff0c;探索新时代公益发展道路。希望公益企业、人物、故事被更多人看到&#xff0c;并呼吁更多人为公益做出自己…

san.js源码解读之工具(util)篇——splitStr2Obj函数

一、 源码解析 /*** 将字符串逗号切分返回对象** param {string} source 源字符串* return {Object}*/ function splitStr2Obj(source) {var result {};each( // 2source.split(,), // 1function (key) { // 3result[key] key;});return result; }把字符串通过 split 函数以…

力扣刷题-链表-链表相交

02.07. 链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返…

C语言动态内存管理malloc、calloc、realloc、free函数的讲解

一.为什么存在动态内存管理&#xff1a; 我们知道&#xff0c;在此之前向内存申请空间的方式有以下两种&#xff1a;&#xff08;变量和数组&#xff09; 但这两种方法有几个缺陷&#xff1a; ①&#xff1a;空间开辟大小是固定的&#xff1b; ②&#xff1a;数组在声明的时候&…