el-upload实现上传文件夹

news2024/11/20 22:38:16

背景:如图一所示,最下面有一个黄色上传文件按钮,为手动上传而且上传区域有上传文件和上传文件夹的区分

所以需要在点击了上传文件夹做特殊处理使得el-upload可以上传文件夹

一、template区域

                        <el-upload
                          class="upload-file"
                          drag
                          multiple
                          ref="uploadRef"
                          :directory="true"
                          v-show="uploadTypeIndex != 2 && fileArray.length == 0 && !isUpload"
                          :file-list="fileArray"
                          :auto-upload="false"
                          :show-file-list="false"
                          :before-upload="handleBeforeUpload"
                          :http-request="handleUploadFile"
                          :on-change="handleFileChange"
                          accept="application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/pdf, text/plain, text/markdown"
                        >
                          <div class="upload-node w-full h-full" @click="handlePreview">
                            <app-svg-icon icon-name="filled-add" class="w-48 h-48 cursor-pointer upload-node-icon" />
                  
                          </div>
                        </el-upload>

二、逻辑区域 

01.在拖拽上传的区域绑定一个点击事件handlePreview,(注意不要直接绑定在el-upload区域,会被触发到两次)

const handlePreview = () => {
  let inputDom: any = null
  nextTick(() => {
    if (document.querySelector('.el-upload__input') != null) {
      inputDom = document.querySelector('.el-upload__input')
      if (uploadTypeIndex.value == 1) {
        inputDom.webkitdirectory = true
      } else {
        inputDom.webkitdirectory = false
      }
    }
  })
}
//点击上传文件夹就将document.querySelector('.el-upload__input')获取到的webkitdirectory 设置为true,选择文件时浏览器就会只筛选文件夹
//点击上传文件就将document.querySelector('.el-upload__input')获取到的webkitdirectory 设置为false

02.此时在el-upload的上传文件方法下面就可以请求后端上传文件

 :http-request="handleUploadFile"

// 上传文件
const handleUploadFile = ({ file }) => {
  console.log(file, '---fie')
  
  //有几个文件就触发了几次
  uploadFileFunc(file)
}

function uploadFileFunc(file: any) {
  
  const formData = new FormData()
  formData.append('field1', '111')
  formData.append('file', file)
  formData.append('field2', '222') 
  //此次携带参数请求
 axios({
    url: 'yourUrl',
    method: 'POST',

    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    data: formData,

    
  }).then(res => {
    if (res != null && res.status == 200) {
      //成功后的逻辑
    }
  })
}

此时我发现我点击上传单个文件或者选取多个文件上传时是可以成功上传的,在handleUploadFile事件中打印的file长这样:webkitRelativePath:" "

上传文件夹时,打印出来的file长这样:webkitRelativePath: "新建文件夹/111111111111111111.txt"

后端直接返回提示 说找不到该文件,所以怀疑就是因为文件path的原因,所以直接将file的webkitRelativePath改为空字符串即可

但是由于file 对象的属性是只读的,所以无法直接修改 file.webkitRelativePath 的值。如果想在前端上传文件夹时去掉文件的路径信息,可以使用 File 构造函数创建一个新的文件对象,只保留文件本身,而不包含路径信息。

修改后的代码如下

// 上传文件
const handleUploadFile = ({ file }) => {
  console.log(file, '---fie')
  let fieClone = new File([file], file.name)//这里就可以文件夹中的每个文件都创建为一个新的 File 对象,并且只保留文件本身
  //有几个文件就触发了几次
  uploadFileFunc(fieClone)//传新的File对象
}

function uploadFileFunc(file: any) {
  
  const formData = new FormData()
  formData.append('field1', '111')
  formData.append('file', file)
  formData.append('field2', '222') 
  //此次携带参数请求
 axios({
    url: 'yourUrl',
    method: 'POST',

    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    data: formData,

    
  }).then(res => {
    if (res != null && res.status == 200) {
      //成功后的逻辑
    }
  })
}

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

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

相关文章

Prometheus metrics数据抓取解析

Prometheus node的监控数据如链接展示&#xff0c;我们希望能更加方便的看到监控数据&#xff0c;shodan对Prometheus metrics 的数据做了格式化处理。172.96.3.215:9100/metricshttp://172.96.3.215:9100/metrics 本文我自己实现了一个命令行工具&#xff0c;可以输出类shodan…

STR时,android发生了什么(一)

在QA的基线中&#xff0c;触发android进入STR流程的方式是向qvm注入power key 按下松开的操作(对于单android的基线&#xff0c;我的理解方式应该也是相同的&#xff0c;都是模拟了power key的按下松开操作&#xff09;。 这个按键操作会通过virtio上报到VHAL层&#xff08;下…

用CSS+SVG做一个优雅的环形进度条

开门见山 先上最终效果图&#xff1a;&#xff08;Demo 传送门&#xff09; 其中进度、尺寸、环宽和颜色都可以非常方便地进行控制。 核心原理&#xff1a; 利用两个重叠的圆环形&#xff0c;通过对上层圆环弧长的控制来表示进度&#xff0c;下层圆环则作为辅助&#xff0c;…

59 分割等和子集

分割等和子集 NP 完全问题&#xff08;01背包&#xff09;题解1 二维DP题解2 空间优化DP&#xff08;改为1D&#xff09; 给你一个只包含正整数的非空数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&a…

Ubuntu - 安装Java 11

在Ubuntu上安装Java 11的最简单方法是通过使用OpenJDK 11。以下是安装Java 11的步骤&#xff1a; 打开终端。 更新包列表&#xff0c;以确保获取最新的软件信息&#xff1a; sudo apt update 安装OpenJDK 11&#xff1a; sudo apt install openjdk-11-jdk 安装后&#xf…

独家原创,改进的智能优化算法

↖加关注这种话银家怎么好意思说出口嘛-- 声明&#xff1a;对于作者的原创代码&#xff0c;禁止转售倒卖&#xff0c;违者必究&#xff01; 以下代码均为作者独家原创&#xff0c;大家可以拿走去水水论文。 有一些质量较高的代码&#xff0c;可以发一些高质量的期刊&#xff0c…

LoogArch 指令集学习

1 SoC_Lite片上系统结构 mycpu和dram、confreg之间有一个“一分二”部件。这是因为在LoongArch指令系统架构下&#xff0c;所有I/O设备的寄存器都是采用memory mapped方式访问的。我们这里实现的confreg也不例外。Memory mapped的访问方式意味I/O设备中的寄存器各自都有一个唯一…

【大数据】Kafka 入门简介

Kafka 入门简介 1.什么是 Kafka2.Kafka 的基本概念3.Kafka 分布式架构4.配置单机版 Kafka4.1 下载并解压包4.2 启动 Kafka4.3 创建 Topic4.4 向 Topic 中发送消息4.5 从 Topic 中消费消息 5.实验5.1 实验一&#xff1a;Python 实现生产者消费者5.2 实验二&#xff1a;消费组实现…

防蓝光护眼灯有用吗?教你认识防蓝光护眼台灯

要不是亲眼所见&#xff0c;真的很难想象一个台灯用处如此大&#xff0c;护眼效果非常明显。说起来很久没有用过护眼灯具了&#xff0c;这次用过之后有着明显的反差&#xff0c;如果能给孩子用&#xff0c;那将大大保障了孩子的用眼、护眼问题。我自己是用来睡前看书的&#xf…

Hadoop集群资源管理器-YARN

1.YARN 简介 Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集群资源管理系统。用户可以将各种服务框架部署在 YARN 上,由 YARN 进行统一地管理和资源分配。 2.YARN架构

欧科云链研究院:人类或将成为仅次于AI第二聪明物种?Web3不允许

出品&#xff5c;欧科云链研究院 在 AI行业“掘金买铲”的英伟达&#xff0c;60%的红杉投资在AI相关领域&#xff0c;之前只专注Web3的顶级VC&#xff0c;Paradigm 正在从转向人工智能等 "前沿 "技术。 资本的追逐让AI迷人且危险。 OKG RESEARCH IN FT AI教父Geoffre…

Docker 容器化(初学者的分享)

目录 一、什么是docker 二、docker的缺陷 三、简单的操作 一、首先配置一台虚拟机 二、安装Docker-CE 一、安装utils 二、 将 Docker 的软件源添加到 CentOS 的 yum 仓库中。这样可以通过 yum 命令来安装、更新和管理 Docker 相关的软件包。 三、将 download.docker.co…

苹果QQ聊天记录导出的3个方法你知道吗?

QQ功能强大、方便快捷&#xff0c;获得众多小伙伴的喜爱。在QQ中最重要的东西莫过于聊天记录。QQ聊天记录中包含了我们日常的点点滴滴、工作业务往来&#xff0c;以及一些重要的文件等等。 有时候&#xff0c;你可能希望将聊天记录导出以节省手机空间&#xff0c;或者拿来留作…

【广州华锐互动】VR高层小区安全疏散演练系统

在今天的高科技时代&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经被广泛应用到各个领域&#xff0c;包括教育和培训。由广州华锐互动定制开发的VR高层小区安全疏散演练系统&#xff0c;开始在房地产行业中崭露头角。这种系统通过模拟真实的紧急情况&#xff0c;帮助…

在博物馆建设方案中,如何考虑功能展项区域的扩展和灵活性?

对于博物馆设计来说&#xff0c;空间内功能展项区域的分布非常重要&#xff0c;关乎展厅内容呈现的视觉效果以及观感体验&#xff0c;我们在了解到博物馆建设主题之后&#xff0c;就需要对其功能展区进行划分&#xff0c;不同类型的分区功能展示&#xff0c;也会影响到用户的参…

5分钟搞懂Jenkins分布式架构

Jenkins通常以单节点模式工作&#xff0c;但其也可以通过代理的方式实现多节点架构&#xff0c;从而能够横向扩展Jenkins系统&#xff0c;支持大规模CICD流水线。原文: Jenkins Distributed Architecture Jenkins是最著名的持续集成工具&#xff0c;是实现DevOps的必要组件之一…

高压开关柜无线测温方法的分类及原理解析

1. 红外热成像法 红外热成像法是一种非接触式的测温方法&#xff0c;通过红外热像仪捕捉目标表面的红外辐射&#xff0c;将其转化为温度分布图像。该方法适用于大范围的温度检测&#xff0c;并且可以实时监测多个位置的温度变化。其原理是利用物体发射的红外辐射与其表面温度…

最新Discuz3.5论坛多合一聚合支付接口插件源码/支持支付宝和微信支付功能

最新Discuz3.5论坛多合一聚合支付接口插件源码/支持支付宝和微信支付功能&#xff0c;这个插件直接替换了自带的支付接口功能&#xff0c;增强了支付的扩展性&#xff0c;它挺方便实用的&#xff0c;自带了支持支付宝、微信、QQ 钱包官方支付&#xff0c;以及彩虹易支付、虎皮椒…

阿里图标的使用

添加购物车&#xff0c;下载代码 引入1 引入2 引入3

小型内衣裤洗衣机哪个牌子好?内衣洗衣机测评

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高强度的清洁&#xff0c;而小小…