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

这篇具有很好参考价值的文章主要介绍了vue3+elementui-plus实现一个接口上传多个文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

首先,先使用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 以上主要通过代码说明,可根据自己实际情况改造
希望我的记录能够帮助到你~文章来源地址https://www.toymoban.com/news/detail-540025.html

到了这里,关于vue3+elementui-plus实现一个接口上传多个文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3+ts+elementui-plus二次封装弹框

    一、弹框组件BaseDialog

    2024年02月15日
    浏览(38)
  • vue3项目创建(vite3+ts+elementui-plus)

    目的:vue3+vite+ts 安装依赖,安装vite的工具 Vite下一代的前端工具链为开发提供极速响应v4.3 创建工程 –template vue-ts 后面的是配置模板,有很多,也有react,官网有介绍 启动工程 安装路由 配置vite-env.d.ts 为了让ts识别.vue文件 安装element-plus 注意vue3用的是element-plus别装错版本了

    2024年02月16日
    浏览(35)
  • VUE3 + Elementui-Plus 之 树形组件el-tree 一键展开(收起);一键全选(不全选)

    实现步骤: tree组件部分: ts部分: 页面效果: 默认状态 展开状态 折叠状态 全选状态 全不选状态 注意:以上方法会展开或折叠所有节点;全选或全不选节点。 问题:数据量过大以上操作会有明显卡顿;有高效解决方法的朋友可以交流。

    2024年04月11日
    浏览(35)
  • 【前端vue升级】vue2+js+elementUI升级为vue3+ts+elementUI plus

    gogo code 是一个基于 AST (源代码的抽象语法结构树状表现形式)的 JavaScript/Typescript/HTML 代码转换工具,可以用它来构建一个代码转换程序来帮助自动化完成如框架升级、代码重构、多平台转换等工作。 当前 GoGoCode 支持解析和操作如下类型的代码: ○JavaScript(JSX) ○Typescript

    2024年02月12日
    浏览(38)
  • 基于Vue3和Element Plus组件库实现一个完整的登录功能

    先看一下最终要实现的效果: 登录页面: 注册页面: (1)引入element-plus组件库 引入组件库的方式有好多种,在这里我就在main.js全局引入了. main.js中代码: 引入之后自己可以用几个按钮测试一下是否引入成功. (2)登录及注册页面 html部分 views/account/Login.vue js部分 css部分(使用了scss) (

    2024年02月05日
    浏览(24)
  • elementUi重置Select选择器样式、option、deep、vue3、plus

    样式标签属性为 style scoped lang=\\\"scss\\\"/style

    2024年02月14日
    浏览(33)
  • 利用级联选择器实现省市区三级联动【vue + elementUI Plus | uViewUI】

    行政区划代码数据下载 github 链接 首先获得省市区三级联动数据 pca-code.json 放置在项目文件夹内 数据格式如图: elementUI 级联选择器 props elementui 级联选择器api提供 props 将value,label,children指定为当前数据的自定义属性值 通过 :props=“cityProps” 2. getCheckedNodes 绑定值变化时触

    2024年02月09日
    浏览(46)
  • 从0开始搭建一个vue3+vite+ts+pinia+element-plus的项目

    前言:vue3+ts+vite大家已经都开始用了,最近也在学习,基本上是零基础开始ts的学习,很多语法知识是边写边查,没有系统的学习ts。此处展示从零开始,搭建的一个框架,方便拿来即用! 其中框架选择vue,语言选择typeScript 项目启动成功以后如下所示: 为了方便日常工作中

    2024年02月06日
    浏览(45)
  • 基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI 高校汉服租赁网站的 设计与实现

    高校汉服租赁网站分为普通用户以及管理员两类                  普通用户: 注册、登录系统、查看汉服首页发帖公告信息、                                 交流论坛(发帖、查看帖子、评论)、                                 公告

    2024年02月10日
    浏览(27)
  • elementUI之下拉选项加多选框功能实现vue3+ts

    根据 @牛先森家的牛奶 的代码修改后实现 具体参考原博主文章,这里只对部分细节调整,记录一下

    2024年02月17日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包