vue3+elementui-plus实现一个接口上传多个文件

news2024/12/27 9:47:24

在这里插入图片描述

首先,先使用element-plus写好上传组件,变量的定义我在这里就省略了都

<el-form-item prop="file" label="附件">
     <el-upload
         style="width:100%"
         class="upload-demo"
         drag
         ref="upload-demo"
         action=""
         v-model="taskForm.file"
         :file-list="fileLists"
         :before-upload="handleBeforeUpload"
         :http-request="uploadFile"
         :on-remove="handleRemove"
         :on-change="handleFileChange"
         :limit="3"
         :on-exceed="handleExceed"
         :headers="headers"
         multiple
     >
         <el-icon class="el-icon--upload"><upload-filled /></el-icon>
         <div class="el-upload__text">
         将文件拖拽到此处,或<em>点击上传</em>
         </div>
         <template #tip>
         <div class="el-upload__tip">
             最多上传3个附件
         </div>
         </template>
     </el-upload>
 </el-form-item>

然后,绑定的函数都补充一下

function handleBeforeUpload (file) {
        //获取上传文件大小
        let fileSize = Number(file.size / 1024 / 1024);

        if (fileSize > 100) {
            ElMessage({ message: '文件大小不能超过100MB,请重新上传。', type: 'warning'})
            return false
        }
    }
    function uploadFile (params) {
        if (params.file == null) {
            ElMessage({ message: '请选择需要上传的文件', type: 'warning'})
            return false
        }
    }
    function handleFileChange (file, fileList) {
        fileLists.value = fileList
    }
    function handleRemove (file, fileList) {
        fileLists.value = fileList
    }
    function handleExceed(files, fileList) {
        ElMessage({ message: '最多上传3个文件,请删除后重新上传!', type: 'warning'})
    }

然后,假设有个提交按钮,点击上传文件请求接口

 /** 提交按钮 */
    function submitForm() {
        proxy.$refs["taskForms"].validate(valid => {
             // 表单其他必填字段校验一下
            if (valid) {
            // 加个loading
                loading.value = ElLoading.service({
                    lock: true,
                    text: 'Loading'
                })
                // 判断是否上传了文件 没有就不用调用上传
                if (fileLists.value.length > 0) {
                    console.log('list', fileLists.value)
                    let fileData = new FormData()
                    var isAdd = false // 区别是否上传了新文件
                    var ids = [] // 编辑时存储已经回显的文件ids
                    // 这里因为编辑和新增逻辑都有,所以在编辑时需要区分,
                    // 到底是上传了新文件,还是说依旧是原来的文件,再提交一下表单,提交其他字段而已
                    // 而判断是否是最新上传的文件就依据是否有文件流raw
                    for(var i =0 ; i< fileLists.value.length; i++) {
                        // 通过是否有文件流raw判断是否上传新文件,是则append
                        if (fileLists.value[i].raw) {
                            isAdd = true
                            fileData.append('file', fileLists.value[i].raw)
                        } else {
                            // 拿到回显文件(即非新上传文件)的id
                            ids.push(fileLists.value[i].id)
                        }
                    }
                    console.log('ids=', ids)
                    fileData.append('type', 1) // type代表上传操作是哪个模块的:1任务 2总结 
                    // 若isAdd=true,则说明添加了新文件,调用上传
                    if (isAdd) {
                        uploadFileData(fileData).then((res) => {
                            console.log('upload', res)
                            if (res.code == 200) {
                                // 回显文件id数组和新上传文件得到的id数组合并
                                taskForm.value.file = ids.concat(res.result.ids)
                                console.log('file-ids',taskForm.value.file)
                                addAndEdit() // 调用保存其他字段信息的接口
                            }
                        })
                    } else {
                        taskForm.value.file = ids
                        addAndEdit() // 调用保存其他字段信息的接口
                    }
                } else {
                    taskForm.value.file = ''
                    addAndEdit() // 调用保存其他字段信息的接口
                }
            }
        })
    }

既然有编辑,那就应该做回显的逻辑,文件如何回显到上传组件上

// 点击编辑
    function editTasks (row) {
        let fileData = new FormData()
        fileData.append('fileId', row.file)
        // 获取文件名
        getFileData(fileData).then((res) => {
            console.log('test', res)
            if (res.code == 200) {
                // 就是这里,拿到文件名,然后文件回显,我这里是通过接口拿到文件名,
                // 如果你能更直接的拿到文件名,直接执行这个foreach即可
                res.result.forEach((item) => {
                // 回显重点,就是把你需要的东西push到fileList中
                    fileLists.value.push({ name: item.fileName, id: item.id })
                })
                console.log('edoite', taskForm.value, fileLists.value)
            }
        })
        taskId.value = row.id
        taskForm.value = {...row}
        taskTitle.value = '编辑任务'
        showTask.value = true
        taskForm.value.file = row.file !== 'null' ?  JSON.parse(row.file) : []    }

over 以上主要通过代码说明,可根据自己实际情况改造
希望我的记录能够帮助到你~

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

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

相关文章

aardio - 【库】printer打印操作库

封装一些常用的绘图、文本功能&#xff0c;可以方便的进行打印。 绘制单位为毫米&#xff0c;精确度为0.01毫米。 库文件下载&#xff1a; http://chengxu.online → aardio资源下载 → printer.rar 打印效果&#xff1a; 示例代码&#xff1a; import console; impor…

在Django中使用xlrd读取excel表格数据

目录 方法一&#xff1a;按行读取 方法二&#xff1a;按表头与表数据一一对应的关系 方法三&#xff1a;按列的方式读取 之前有说到如何在Django中读取数据库数据写入到excel中 今天来说说如何读取excel中的数据&#xff0c;&#xff08;读取后就可以写入到数据库中了&#…

大数据分析平台选型全攻略:关注这五点绝不会错过!

大数据时代&#xff0c;选择适合的大数据分析平台已然成为企业成功的关键条件之一。企业在选择大数据分析平台时需要关注平台的适用性、可扩展性、可靠性、易用性和价格等五个方面。同时&#xff0c;需要结合自身的业务需求和预算进行综合考虑&#xff0c;这样才能在众多的大数…

ubuntu常用软件安装、异常处理

1.ubuntu更换源 打开以下文件&#xff1a; sudo gedit /etc/apt/sources.list 在文件中添加如下内容 #中科大源 deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main re…

在SpringBoot中整合RabbitMQ(19版idea)

首先呢就需要我们在RabbitMQ的可视化端口创建一个虚拟机,我创建的为 xm 1.创建SpringBoot项目 到这里SpringBoot项目就创建成功了 2.创建测试类 Testpublic void testConnection() throws Exception {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory…

MySQL高级整理

MySQL体系结构 Client Connectors&#xff1a; 接入方支持的协议。Management Serveices & Utilities&#xff1a; 系统管理和控制工具&#xff0c;mysqldump、 mysql复制集群、分区管理等。Connection Pool&#xff1a; 连接池&#xff0c;管理缓冲用户连接、用户名、密码…

IPv6 学习笔记

文章目录 一、概念和现状二、适用场景三、地址分配四、检查是否连接到IPv6网络五、查询本机的IPv6地址六、访问IPv6资源的方法 一、概念和现状 IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#x…

原型链与作用域链

在 JavaScript 中使用构造函数来新建一个对象的&#xff0c;每一个构造函数内部都有一个 prototype 属性&#xff0c;属性值是一个对象&#xff0c;这个对象包含了可以由该构造函数的所有实例共享的属性和方法。当使用构造函数新建一个对象后&#xff0c;在这个对象的内部将包含…

electron打包exe桌面项目打开控制台

阿丹&#xff1a; 之前一直在写web项目&#xff0c;按F12开发控制台很方便但是。现在项目涉及到了桌面的应用这就需要在打包的过程中进行书写配置文件main中添加指令来在app加载完成后打开控制台&#xff0c;这样方便我们寻找报错。 打开方式1 因为使用的工具是electron所以找…

Kubernetes中Pod的调度策略

Kubernetes中Pod的调度策略 1、Pod调度 在 Kubernetes 平台上&#xff0c;我们很少会直接创建一个 Pod&#xff0c;在大多数情况下会通过 RC、Deployment、 DaemonSet、Job 等控制器完成对一组 Pod 副本的创建、调度及全生命周期的自动控制任务。 在最早的 Kubernetes 版本…

【动态规划算法练习】day17

文章目录 一、474. 一和零1.题目简介2.解题思路3.代码4.运行结果 二、879. 盈利计划1.题目简介2.解题思路3.代码4.运行结果 三、377. 组合总和 Ⅳ1.题目简介2.解题思路3.代码4.运行结果 四、96. 不同的二叉搜索树1.题目简介2.解题思路3.代码4.运行结果 总结 二维费用的背包问题…

5分钟了解制造核心5大系统的联系

本篇&#xff0c;我们来快速了解一下制造行业核心的5大系统MES、ERP、WMS、PLM和SCADA究竟有怎么样的关系&#xff0c;它们是如何连接的。 上图粗略描述了MES、ERP、WMS、PLM和SCADA五大系统之间的连接关系。 不过&#xff0c;我们先从ERP系统开始&#xff0c;因为这是大部分制…

前端Vue自定义精美底部操作栏导航栏工具栏 可用于电商购物车底部导航

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。通过组件化开发&#xff0c;可以有效实现单…

Python实现PSO粒子群优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

java中CompletableFuture异步编程详解以及实践案例

文章目录 一、CompletableFuture的使用1、 创建CompletableFuture的方式2、 获得异步执行结果3、 对执行结果进行处理4、对执行结果进行消费5、异常处理6、 两组任务按顺序执行7、 两组任务谁快用谁8、 两组任务完成后合并9、 多任务组合 二、一个使用CompletableFuture异步编排…

【算法】区间合并类题目总结

文章目录 重叠区间&#xff1a;452. 用最少数量的箭引爆气球解法1——左边界排序解法2——右边界排序 无重叠区间&#xff1a;435. 无重叠区间解法1——左边界排序解法2——右边界排序 合并区间&#xff1a;56. 合并区间左边界排序这题为什么不能按照右边界排序&#xff1f;其实…

【数据结构与算法】图课后习题

题目 下面一共有七道有关图的课后习题&#xff0c;全部都是思路画图题并不是算法设计题故在此就一起列举出来了~ 1. 已知如下图所示的有向图&#xff0c;请回答下面几个问题 每个顶点的入/出度&#xff1b;邻接矩阵&#xff1b;邻接表&#xff1b;逆邻接表&#xff1b;强连通…

Hugging Face应用——图像识别

利用人工智能解决音频、视觉和语言问题。音频分类、图像分类、物体检测、问答、总结、文本分类、翻译等均有大量模型进行参考。 Eg1: 图像识别 图像分类是为整个图像分配标签或类别的任务。每张图像预计只有一个类别。图像分类模型将图像作为输入并返回有关图像所属类别的预测…

OPPO手机上怎么设置阴历或阳历生日提醒?

有不少手机用户现在使用的都是OPPO这个品牌的手机&#xff0c;并且绝大多数用户都表示OPPO手机是比较好用的&#xff0c;不过也有一部分用户在使用手机的过程中遇到了一些问题&#xff0c;例如不知道在OPPO手机上怎么设置阴历或阳历生日提醒&#xff0c;这应该怎么办呢&#xf…

基于matlab开发和评估停车场场景中的视觉定位算法(附源码)

一、前言 本示例展示了如何使用虚幻引擎模拟环境中的合成图像数据开发视觉定位系统。 获取基本事实以评估定位算法在不同条件下的性能是一项具有挑战性的任务。与使用高精度惯性导航系统或差分GPS等更昂贵的方法相比&#xff0c;不同场景下的虚拟仿真是一种经济高效的方法来获…