扩展element-ui的el-upload上传组件,实现复制粘贴上传图片文件,带图片预览功能

需求说明

原业务系统中的图片上传功能经常使用,普通的添加按钮只能通过系统对话框打开本地计算机目录,
在本地文件夹中选择要上传的图片。
导致在使用业务系统过程中,截图后需要先将图片存储到本地计算机目录,再点击页面图片上传。
在重复使用该功能时会浪费过多的时间在图片保存,上传。
为了解决业务该问题,亟需对该图片上传功能进行改造,避免业务人员过多的时间浪费在图片上传操作。

改造路线

为了简化图片上传步骤,增加直接粘贴 “粘贴板”中的图片文件,做到图片不落地,减少图片上传所需要的操作步骤。

改造前分析

通过对前端框架的分析,当前图片上传功能,采用 element-ui 组件,版本为 2.15.6
实现粘贴图片,需要监听ctrl + v 命令

开始改造

控件改造

在窗口的 el-form 控件参数中添加 @paste.native 事件,事件绑定方法名 handlePaste

也可以在其他控件中添加事件监听,看个人需求。


注意: 监听粘贴事件时,需要当前页面先获取焦点,否则无法正常监听, 可以在页面加载后调用 focus() 获取焦点


粘贴功能Js部分参考资料:https://blog.csdn.net/blue__k/article/details/125296866

<el-form
  ref="xxxx"
  @paste.native="handlePaste"
  :model="form"
  label-position="right"
  label-width="92px"
  class="page-form"
  style="width: 100%;"
>
------------------------ 分割线 ----------------------
// el-upload控件不用做任何修改,此处仅作展示
<el-upload  
  class="el-upload–picture-card"
  action=""
  :limit="12"
  ref="upload"
  list-type="picture-card"
  :on-preview="handlePictureCardPreview4"
  :before-upload="beforeAvatarUpload4"
  :on-remove="handleRemove4"
  :on-change="handleEditChange4"
  :http-request='uploadlinkmanAfter'
  :file-list="fileList"
  accept=".png,.jpg,.bmp,.jpeg"
  :class="{hide:hideUploadEdit4}"
    >
    <i slot="default" class="el-icon-plus"></i>
    <div slot="tip" class="el-upload__tip">
      只能上传(png,jpg,bmp,jpeg)图片文件,不超过10MB,只允许上传一份文件
    </div>
</el-upload>


Javascript 实现函数

/**
 * 监听粘贴操作
 */
handlePaste(e) {
  var clipboardData = e.clipboardData; // IE
  if (!clipboardData) {
      //chrome
    clipboardData = e.originalEvent.clipboardData;
  }
  var items='';
  items = (e.clipboardData || window.clipboardData).items;
  let file = null;
  if (!items || items.length === 0) {
    this.$message.error('当前浏览器不支持粘贴本地图片,请打开图片复制后再粘贴!');
    return;
  }
  // 搜索剪切板items
  for (let i = 0; i < items.length; i++) {
    // 限制上传文件类型
    if (items[i].type.indexOf('image') !== -1) {
      file = items[i].getAsFile();
      break;
    }
  }
  // 对复制黏贴的类型进行判断,若是非文件类型,比如复制黏贴的文字,则不会调用上传文件的函数
  if(file){
    // 上传到图片服务器
    xxxxx.uploadImage2OSS(file);
  }
},

遇到的问题(可以监听到粘贴事件,但没有生成缩略图)

在生成预览图的时候遇到了粘贴后的图片没有生成预览图片,跟踪到element-ui控件的源码中

先打开开发者工具,发现正常的预览图片 src 属性有 blob:http://localhost/xxxxx

由于该图片的url是本地缓存的图片文件,所以在upload控件中必然有图片缓存函数存在

继续跟踪upload控件有可能创建图片的源码,在index.vue文件第165行(仅供当前版本,其他版本可能有差异)中发现这样一行代码:file.url = URL.createObjectURL(rawFile);

handleStart(rawFile) {
  rawFile.uid = Date.now() + this.tempIndex++;
  let file = {
    status: 'ready',
    name: rawFile.name,
    size: rawFile.size,
    percentage: 0,
    uid: rawFile.uid,
    raw: rawFile
  };

  if (this.listType === 'picture-card' || this.listType === 'picture') {
    try {
      file.url = URL.createObjectURL(rawFile);
    } catch (err) {
      console.error('[Element Error][Upload]', err);
      return;
    }
  }

  this.uploadFiles.push(file);
  this.onChange(file, this.uploadFiles);
},

修改后的Javascript函数,调用upload控件中的 handleStart() 函数

/**
 * 监听粘贴操作
 */
handlePaste(e) {
  var clipboardData = e.clipboardData; // IE
  if (!clipboardData) {
      //chrome
    clipboardData = e.originalEvent.clipboardData;
  }
  var items='';
  items = (e.clipboardData || window.clipboardData).items;
  let file = null;
  if (!items || items.length === 0) {
    this.$message.error('当前浏览器不支持粘贴本地图片,请打开图片复制后再粘贴!');
    return;
  }
  // 搜索剪切板items
  for (let i = 0; i < items.length; i++) {
    // 限制上传文件类型
    if (items[i].type.indexOf('image') !== -1) {
      file = items[i].getAsFile();
      break;
    }
  }
  // 对复制黏贴的类型进行判断,若是非文件类型,比如复制黏贴的文字,则不会调用上传文件的函数
  if(file){
    // 上传到图片服务器
    xxxxx.uploadImage2OSS(file);
    // 生成预览图
    this.$refs.upload.handleStart(file);
  }
},

最终实现的效果图

图片上传效果图


扩展element-ui el-upload组件,实现复制粘贴上传图片文件,带图片预览功能的更多相关文章

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. js中‘!.’是什么意思

  3. InnoDB 和 MyISAM 引擎恢复数据库,使用 .frm、.ibd文件恢复数据库

  4. Error: Cannot find module ‘node:util‘问题解决

    控制台 安装 Vue-Cli 最后一步出现 Error: Cannot find module 'node:util' 问题解决方案1.问题C:\Windows\System32>cnpm install -g @vue/cli@4.0.3internal/modules/cjs/loader.js:638 throw err; &nbs

  5. yarn的安装和使用(全网最详细)

    一、yarn的简介:Yarn是facebook发布的一款取代npm的包管理工具。二、yarn的特点:速度超快。Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级可靠。使用详细、简洁的锁文件格式和明确的安装算法,Yarn 能够保证在不同系统上无差异的工作。三、y

  6. 前端环境 本机可切换node多版本 问题源头是node使用的高版本

    前言投降投降 重头再来 重装环境 也就分分钟的事 偏要折腾 这下好了1天了 还没折腾出来问题的源头是node 使用的高版本 方案那就用 本机可切换多版本最终问题是因为nodejs的版本太高,导致的node-sass不兼容问题,我的node是v16.14.0的版本,项目中用了"node-sass": "^4.7.2"版本,无法匹配当前的node版本根据文章的提

  7. 宝塔Linux的FTP连接不上的解决方法

    宝塔Linux的FTP连接不上的解决方法常见的几个可能,建议先排查。1.注意内网IP和外网IP2.检查ftp服务是否启动 (面板首页即可看到)3.检查防火墙20端口 ftp 21端口及被动端口39000 - 40000是否放行 (如是腾讯云/阿里云等还需检查安全组)4.是否主动/被动模式都不能连接5.新建一个用户看是否能连接6.修改ftp配置文件 将ForcePassiveIP前面的#去掉 将19

  8. 扩展element-ui el-upload组件,实现复制粘贴上传图片文件,带图片预览功能

  9. 微信小程序canvas实现水平、垂直居中效果

    这篇文章主要介绍了小程序中canvas实现水平、垂直居中效果,本文图文实例代码相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  10. 使用HTML5做的导航条详细步骤

    这篇文章主要介绍了用HTML5做的导航条详细步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

随机推荐

  1. 扩展element-ui el-upload组件,实现复制粘贴上传图片文件,带图片预览功能

  2. 如何在vue项目中引入elementUI组件

    总结以上是DEVMAX为你收集整理的如何在vue项目中引入elementUI组件全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  3. vue2.0-基于elementui换肤[自定义主题]

    总结以上是DEVMAX为你收集整理的vue2.0-基于elementui换肤[自定义主题]全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

返回
顶部