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

vue文件或文件夹拖拽上传

一、示例

二、组件代码

<template><divclass="drop-area":class="{ dragging: isDragging }"@dragover.prevent="handleDragOver"@dragleave="handleDragLeave"@drop.prevent="handleDrop"><el-icon class="el-icon--upload"><upload-filled /></el-icon><p>拖拽文件或文件夹到此处,开始上传</p><!-- <p v-if="fileList.length">已选择 {{ fileList.length }} 个文件</p> --></div>
</template><script setup>import { ref, defineEmits } from 'vue'const emits = defineEmits(['change'])// 响应式状态const isDragging = ref(false)const fileList = ref([])// 处理拖拽进入const handleDragOver = (e) => {isDragging.value = truee.dataTransfer.dropEffect = 'copy'}// 处理拖拽离开const handleDragLeave = () => {isDragging.value = false}// 处理文件放置const handleDrop = async (e) => {isDragging.value = falseconst droppedFiles = await extractFilesFromDropEvent(e)fileList.value = [...droppedFiles]console.log(droppedFiles, 123)emits('change', droppedFiles)}// 从拖拽事件中提取所有文件const extractFilesFromDropEvent = async (event) => {const items = event.dataTransfer.itemsconsole.log('拖拽项数量:', items?.length)if (!items) return []// 使用Promise.all并行处理所有文件项const promises = Array.from(items).map(async (item) => {if (item.kind === 'file') {const entry = item.webkitGetAsEntry()if (entry) {console.log('正在处理文件:', entry)// 递归处理文件条目const fileResult = await traverseFileEntry(entry, '')return fileResult}}return null})// 等待所有处理完成并合并结果const results = await Promise.all(promises)// 扁平化结果数组并过滤掉null值return results.flat().filter(Boolean)}// 递归遍历文件系统条目const traverseFileEntry = (entry, relativePath) => {return new Promise((resolve) => {if (entry.isFile) {// 处理文件entry.file((file) => {// 添加相对路径信息file.relativePath = relativePath ? `${relativePath}/${file.name}` : ''resolve(file)})} else if (entry.isDirectory) {// 处理目录const dirReader = entry.createReader()dirReader.readEntries(async (entries) => {const subPath = relativePath? `${relativePath}/${entry.name}`: entry.name// 对目录项使用Promise.all并行处理const promises = Array.from(entries).map((subEntry) =>traverseFileEntry(subEntry, subPath))const results = await Promise.all(promises)// 扁平化目录下的所有文件resolve(results.flat().filter(Boolean))})} else {resolve(null)}})}
</script><style scoped>.drop-area {width: 100%;min-height: 100px;border: 2px dashed #ccc;border-radius: 8px;display: flex;flex-direction: column;align-items: center;justify-content: center;padding: 20px;transition: all 0.3s ease;margin: 0px;}.drop-area.dragging {border-color: #409eff;background-color: rgba(64, 158, 255, 0.1);}.drop-area p {margin: 5px 0;color: #666;}.drop-area .el-icon--upload {font-size: 50px;color: #999;}
</style>

@change获取上传file文件

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

相关文章:

  • 悬空标记攻击 -- idekctf 2025 CTFinder
  • qt界面优化--api绘图
  • 杰里常用功能API
  • 科普:python中的“__init__.py”与“import”的关系
  • React中的Hook到底是个什么鬼
  • 北京-4年功能测试2年空窗-报培训班学测开-第七十四天-线下面试-聊的很满意但可能有风险-等信吧
  • mysql中的常见的索引类型及其特点
  • 【活动回顾】开源共建 · 智能体时代的 AI 基础设施全栈实践
  • 并发编程中的 ABA 问题:从原理到实战解决方案
  • Java数据结构之LinkedList
  • 电子电路原理学习笔记---第5章特殊用途二极管---第2天
  • 基于51单片机RFID智能门禁系统红外人流量计数统计
  • -bash: ./restart.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
  • MySQL 从入门到精通:基础概念与操作指南
  • Sklearn 机器学习 异常值检测 局部异常因子算法LOF
  • SQL连接操作全解析:从入门到精通
  • 某跨国金融机构法律法规自动文本摘要(ATS/文本大意提取)功能规划
  • 嵌入式第二十六天(文件IO相关操作)
  • [Robotics_py] docs | 机器人状态/位姿 | 环境表示_栅格地图
  • 准则 :用“检测到什么”的方式来编写需求条件
  • Python 异常捕获
  • 为什么我换了项目管理软件?
  • 如何在 Odoo 18 管理产品文档手册
  • Redis面试题及详细答案100道(16-32) --- 数据类型事务管道篇
  • 第23章,景深:技术综述
  • 软件测试之功能测试
  • 嵌入式系统学习Day17(文件编程)
  • (树形 dp、数学)AT_dp_v Subtree 题解
  • 架构设计:设计原则
  • 第十一节:加载外部模型:GLTF/OBJ格式解析