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

使用Element UI实现一个拖拽图片上传,并可以Ctrl + V获取图片实现文件上传

要在 Element UI 的拖拽上传组件中实现 Ctrl + V 图片上传功能,可以通过监听键盘事件来捕获粘贴操作,并将粘贴的图片数据上传到服务器。

版本V1,实现获取粘贴板中的文件

注意,本案例需要再你已经安装了Element UI并在项目中正确配置的情况下进行,第一个版本仅适合上传jpeg和png的图片

创建拖拽上传组件
假设你已经有一个基本的拖拽上传组件,我们可以在此基础上添加 Ctrl + V 功能。

监听粘贴事件
我们需要在页面中监听 paste 事件,当用户按下 Ctrl + V 时,捕获粘贴板中的图片数据。

处理粘贴事件

在捕获到图片数据后,将其转换为 File 对象,并调用上传方法。

代码如下:

<template><div><el-uploaddragaction="https://jsonplaceholder.typicode.com/posts/":on-preview="handlePreview":on-remove="handleRemove":before-upload="beforeUpload"multipleref="upload"><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div><div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不超过500kb</div></el-upload></div>
</template>
<script>
import { Upload } from 'element-ui';export default {name: 'DragUpload',methods: {handlePaste(event) {// 捕获粘贴事件const items = event.clipboardData.items;for (let i = 0; i < items.length; i++) {if (items[i].type.indexOf('image') !== -1) {// 获取图片文件const file = items[i].getAsFile();this.handleFile(file);break;}}},handleFile(file) {// 将文件添加到上传队列this.$refs.upload.handleStart(file);this.$refs.upload.submit();},handlePreview(file) {console.log('Preview:', file);},handleRemove(file, fileList) {console.log('Remove:', file, fileList);},beforeUpload(file) {const isJPGorPNG = file.type === 'image/jpeg' || file.type === 'image/png';const isLt500K = file.size / 1024 < 500;if (!isJPGorPNG) {this.$message.error('只能上传 JPG/PNG 格式的图片!');}if (!isLt500K) {this.$message.error('图片大小不能超过 500KB!');}return isJPGorPNG && isLt500K;}},mounted() {// 监听粘贴事件document.addEventListener('paste', this.handlePaste);},beforeDestroy() {// 移除粘贴事件监听document.removeEventListener('paste', this.handlePaste);}
};
</script>
  1. HTML部分:使用 el-upload 组件创建一个拖拽上传区域。
  2. JavaScript部分:
    • handlePaste 方法:捕获粘贴事件,检查粘贴板中的数据是否为图片文件,如果是,则调用 handleFile 方法。
    • handleFile 方法:将图片文件添加到上传队列,并提交上传。
    • mounted 生命周期钩子:添加粘贴事件监听器。
    • beforeDestroy 生命周期钩子:移除粘贴事件监听器,防止内存泄漏。

随便截图一张,我们这个时候ctrl + v 就可以发现他可以获取我们粘贴板中的文件。

在这里插入图片描述
在这里插入图片描述
我们到这一步发现,图片网页是获取到。这个时候你在跟着你的业务,传递相关参数,这第V1版本就可以用了。

第二版本V2,可以直接在粘贴的过程在下面以压缩图片的形式展示图片

<template><div><el-uploaddrag:action="uploadFileUrl":on-preview="handlePreview":on-remove="handleRemove":before-upload="beforeUpload":on-success="handleSuccess"multipleref="upload":file-list="fileList"><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div><div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不超过500kb</div></el-upload><!-- 显示上传后的文件 --><div v-for="(file, index) in fileList" :key="index" class="uploaded-file"><div v-if="isImage(file.name)"><img :src="file.url" alt="Uploaded Image" class="uploaded-image" /><el-button type="text" @click="removeFile(index)">移除</el-button></div><div v-else><span>{{ file.name }}</span><el-button type="text" @click="removeFile(index)">移除</el-button></div></div></div>
</template>
<script>
import { Upload } from 'element-ui';export default {name: 'DragUpload',data() {return {fileList: []};},methods: {handlePaste(event) {const items = event.clipboardData.items;for (let i = 0; i < items.length; i++) {if (items[i].type.indexOf('image') !== -1) {const file = items[i].getAsFile();this.handleFile(file);break;}}},handleFile(file) {const reader = new FileReader();reader.onload = (e) => {this.fileList.push({name: file.name,url: e.target.result});};reader.readAsDataURL(file);this.$refs.upload.handleStart(file);this.$refs.upload.submit();},handlePreview(file) {console.log('Preview:', file);},handleRemove(file, fileList) {this.fileList = fileList;},beforeUpload(file) {const isJPGorPNG = file.type === 'image/jpeg' || file.type === 'image/png';const isLt500K = file.size / 1024 < 500;if (!isJPGorPNG) {this.$message.error('只能上传 JPG/PNG 格式的图片!');}if (!isLt500K) {this.$message.error('图片大小不能超过 500KB!');}return isJPGorPNG && isLt500K;},handleSuccess(response, file, fileList) {// 更新 fileListthis.fileList = fileList.map(f => ({name: f.name,url: f.url || f.response.url // 假设服务器返回的响应中有 url 字段}));},removeFile(index) {this.fileList.splice(index, 1);},isImage(fileName) {return fileName.toLowerCase().endsWith('.jpg') || fileName.toLowerCase().endsWith('.png');}},mounted() {document.addEventListener('paste', this.handlePaste);},beforeDestroy() {document.removeEventListener('paste', this.handlePaste);}
};
</script>
<style scoped>
.uploaded-file {margin-top: 10px;display: flex;align-items: center;
}.uploaded-image {max-width: 100px;max-height: 100px;margin-right: 10px;
}
</style>

在这里插入图片描述

在这里插入图片描述
如图所示。Ctrl + V就实现到了这一步。这里有问题,那就是你看一下,点击上传后的图片是否会显示出来呢?

http://www.lryc.cn/news/481702.html

相关文章:

  • 私域流量圈层在新消费时代的机遇与挑战:兼论开源 AI 智能名片、2 + 1 链动模式、S2B2C 商城小程序的应用
  • vxe-vxe-colgroup后端返回数据 对数据进行处理 动态合并分组表头(v-if控制表格渲染(数据请求完成后渲染))
  • ESLint 使用教程(五):从输入 eslint 命令到最终代码被处理,ESLint 中间究竟做了什么工作
  • 【安全测试】sqlmap工具(sql注入)学习
  • YOLOv11融合CVPR[2023]空间和通道重建卷积ScConv模块及相关改进思路|YOLO改进最简教程
  • C++研发笔记13——C语言程序设计初阶学习笔记11
  • html5拖放
  • 卫导调零天线功率倒置算法原理及MATLAB仿真
  • 【划分型 DP】力扣139. 单词拆分
  • Python学习从0到1 day26 第三阶段 Spark ④ 数据输出
  • AWTK fscript 中的 JSON 扩展函数
  • 动态规划 —— dp 问题-买卖股票的最佳时机III
  • “绽放艺术风采、激发强国力量” 海南省第十一届中小学生艺术展演活动圆满开展
  • Linux之文件和目录类命令详解(2)
  • NVR管理平台EasyNVR多品牌NVR管理工具/设备摄像头开启ONVIF的方法
  • Pr 视频过渡:沉浸式视频
  • SwiftUI开发教程系列 - 第1章:简介与环境配置
  • gitlab ci/cd搭建及使用笔记
  • Xcode 16 中 Swift Testing 的参数化(Parameterized)机制趣谈
  • Python自动化运维DevSecOps与安全自动化
  • 2024下半年系统架构师考试【回忆版】
  • UE5.4 PCG 自定义PCG蓝图节点
  • 迁移学习相关基础
  • 华为云计算HCIE-Cloud Computing V3.0试验考试北京考场经验分享
  • 数据分析——学习框架
  • 量化交易系统开发-实时行情自动化交易-3.4.2.Okex行情交易数据
  • pytorch实现深度神经网络DNN与卷积神经网络CNN
  • 芯片测试-LDO测试
  • 期权懂|期权新手看过来:看跌期权该如何交易?
  • 《深入浅出HTTPS​​​​​​​​》读书笔记(8):密码学Hash算法的分类