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

 更新时间:2023年07月11日 10:21:21   作者:今天不要写bug  
这篇文章主要介绍了vue3+elementui-plus实现一个接口上传多个文件,先使用element-plus写好上传组件,然后假设有个提交按钮,点击上传文件请求接口,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下

首先,先使用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 以上主要通过代码说明,可根据自己实际情况改造

到此这篇关于vue3+elementui-plus实现一个接口上传多个文件的文章就介绍到这了,更多相关vue3 elementui-plus上传多个文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue中Form 表单的 resetFields() 失效原因及问题解决

    vue中Form 表单的 resetFields() 失效原因及问题解决

    在Vue项目中,使用formRef.value.resetFields()方法重置表单时可能遇到不起作用的问题,下面就来介绍一下如何解决,感兴趣的可以了解一下
    2024-09-09
  • Vue.js使用computed属性实现数据自动更新

    Vue.js使用computed属性实现数据自动更新

    在Vue组件中,computed属性是在组件的选项对象中声明的,你可以把它们想象成组件的一个小功能,告诉Vue当某些数据变化时,如何更新界面,本文给大家介绍了Vue.js使用computed属性实现数据自动更新,需要的朋友可以参考下
    2024-06-06
  • Vue watch原理源码层深入讲解

    Vue watch原理源码层深入讲解

    watch 是由用户定义的数据监听,当监听的属性发生改变就会触发回调,这项配置在业务中是很常用。在面试时,也是必问知识点,一般会用作和 computed 进行比较。那么本文就来带大家从源码理解 watch 的工作流程,以及依赖收集和深度监听的实现
    2022-10-10
  • 关于vue中根据用户权限动态添加路由的问题

    关于vue中根据用户权限动态添加路由的问题

    每次路由发生变化时都需要调用一次路由守卫,并且store中的数据会在每次刷新的时候清空,因此需要判断store中是否有添加的动态路由,本文给大家分享vue中根据用户权限动态添加路由的问题,感兴趣的朋友一起看看吧
    2021-11-11
  • 解决vue项目Error:Cannot find module‘xxx’类报错问题

    解决vue项目Error:Cannot find module‘xxx’类报错问题

    当npm运行报错Error:Cannot find module 'xxx'时,通常是因为node_modules文件或依赖未正确安装,解决步骤包括删除node_modules和package-lock.json文件,重新运行npm install,并根据需要安装额外插件,若网络问题导致安装失败
    2024-10-10
  • 解决Vue.js Devtools未检测到Vue实例的问题

    解决Vue.js Devtools未检测到Vue实例的问题

    在开发Vue.js应用时,Vue.js Devtools是一个不可或缺的调试工具,然而,有时我们可能会遇到“Vue.js not detected”的提示,这意味着Vue.js Devtools未能成功识别和连接到我们的Vue应用,本文将详细解析这个问题,并提供相应的解决步骤与代码示例,需要的朋友可以参考下
    2024-01-01
  • Vue的路由配置过程(Vue2和Vue3的路由配置)

    Vue的路由配置过程(Vue2和Vue3的路由配置)

    这篇文章回顾了Vue2和Vue3中路由的配置步骤,包括安装正确的路由版本、创建路由实例、配置routes以及在入口文件中注册路由,Vue2中使用Vue.use(VueRouter),而Vue3中使用createRouter和createWebHashHistory
    2025-01-01
  • 如何基于Vue制作一个猜拳小游戏

    如何基于Vue制作一个猜拳小游戏

    Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式,下面这篇文章主要给大家介绍了关于如何基于Vue制作一个猜拳小游戏的相关资料,需要的朋友可以参考下
    2023-01-01
  • uniapp嵌套webview无法返回上一级解决方式

    uniapp嵌套webview无法返回上一级解决方式

    uniapp是一款非常强大的跨平台开发框架,它可以让我们只编写一份代码,就能在多个平台上运行,这篇文章主要给大家介绍了关于uniapp嵌套webview无法返回上一级的解决方式,需要的朋友可以参考下
    2024-05-05
  • 详解Vue的组件注册

    详解Vue的组件注册

    组件是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能,需要的朋友可以参考下
    2023-05-05

最新评论