【ElementUI】Vue+ElementUI多文件上传,一次请求上传多个文件!

简介: 教大家一次请求,上传多个文件。ElementUI如果是默认方案,上传多张图片并不是真正的一次上传多张,而是发送多次请求,一次请求携带一张图片。

Element UI Upload

⭐今天教大家使用ElementUI的自定义上传

⭐请求一次上传多张图片

最近写项目的时候需要一次上传多张图片,使用ElementUI Upload的时候发现

如果是默认方案,上传多张图片并不是真正的一次上传多张,而是发送多次请求,一次请求携带一张图片

接下来分享一下我的解决思路

  • ElementUI版本:2.15.9
  • Vue版本:2.7.10

Html部分

<!-- 需要携带以下参数 -->
<!-- ref 用于获取组件触发API -->
<!-- auto-upload 关闭自动上传 -->
<!-- http-request 设置自定义上传的函数 -->
<!-- on-change 图片列表改变时触发的函数 -->
<!-- multiple 允许上传多个文件 -->
<el-upload
           ref="upload"
           :auto-upload="false"
           :http-request="uploadFile"
           :on-change="changeFileLength"
           multiple>
    <i class="el-icon-upload"></i>
    <div class="el-upload__text">点击上传文件</div>
    </el-upload>
<!-- 上传时点击的按钮 -->
<el-button @click="upload" type="success">上传文件</el-button>

JS部分

export default {
    name: "uploadCT",
    data(){
        return{
            // 上传文件的列表
            uploadFiles: [],
            // 上传文件的个数
            filesLength: 0,
            // 上传需要附带的信息
            info:{
                id:"",
                name:"",
            },
        }
    },

    methods:{
        // 修改当前文件列表长度
        changeFileLength(file, fileList){
            this.filesLength = fileList.length
        },

        // 用户点击上传调用
        async upload(){
            // 触发上传 调用配置 :http-request="uploadFile"
            // 即触发 uploadFile函数
            await this.$refs.upload.submit();
            // 上传完成后执行的操作 ...
        },

        // 该函数还是会被调用多次
        // 每次param参数传入一个文件
        uploadFile(param){
            // 将文件加入需要上传的文件列表
            this.uploadFiles.push(param.file)
            // 当uploadFiles长度等于用户需要上传的文件数时进行上传
            if (this.uploadFiles.length == this.filesLength){
                // 创建FormData上传
                let fd = new FormData()
                // 将全部文件添加至FormData中
                this.uploadFiles.forEach(file => {
                    fd.append('file', file)
                })
                // 将附加信息添加至FormData
                fd.append("id", this.info.id)
                fd.append("name", this.info.name)
                // 配置请求头
                const config = {
                    headers: {
                        "Content-Type": "multipart/form-data",
                    }
                }
                // 上传文件
                this.$axios.post("/upload/upload_CT/", fd, config).then(res => {
                    /*上传成功处理*/
                }).catch(err => {/*报错处理*/});
            }
        }
    }
}

Vue组件完整代码

  • 请根据如下步骤配置

    1. 配置upload组件与上传文件按钮
    2. 配置changeFileLength函数
    3. 配置upload函数
    4. 配置uploadFile函数
<template>
<!-- 需要携带以下参数 -->
<!-- ref 用于获取组件触发API -->
<!-- auto-upload 关闭自动上传 -->
<!-- http-request 设置自定义上传的函数 -->
<!-- on-change 图片列表改变时触发的函数 -->
<!-- multiple 允许上传多个文件 -->
<el-upload
           ref="upload"
           :auto-upload="false"
           :http-request="uploadFile"
           :on-change="changeFileLength"
           multiple>
    <i class="el-icon-upload"></i>
    <div class="el-upload__text">点击上传文件</div>
    </el-upload>
<!-- 上传时点击的按钮 -->
<el-button @click="upload" type="success">上传文件</el-button>
</template>

<script>
    export default {
        name: "uploadCT",
        data(){
            return{
                // 上传文件的列表
                uploadFiles: [],
                // 上传文件的个数
                filesLength: 0,
                // 上传需要附带的信息
                info:{
                    id:"",
                    name:"",
                },
            }
        },

        methods:{
            // 修改当前文件列表长度
            changeFileLength(file, fileList){
                this.filesLength = fileList.length
            },

            // 用户点击上传调用
            async upload(){
                // 触发上传 调用配置 :http-request="uploadFile"
                // 即触发 uploadFile函数
                await this.$refs.upload.submit();
                // 上传完成后执行的操作 ...
            },

            // 该函数还是会被调用多次
            // 每次param参数传入一个文件
            uploadFile(param){
                // 将文件加入需要上传的文件列表
                this.uploadFiles.push(param.file)
                // 当uploadFiles长度等于用户需要上传的文件数时进行上传
                if (this.uploadFiles.length == this.filesLength){
                    // 创建FormData上传
                    let fd = new FormData()
                    // 将全部文件添加至FormData中
                    this.uploadFiles.forEach(file => {
                        fd.append('file', file)
                    })
                    // 将附加信息添加至FormData
                    fd.append("id", this.info.id)
                    fd.append("name", this.info.name)
                    // 配置请求头
                    const config = {
                        headers: {
                            "Content-Type": "multipart/form-data",
                        }
                    }
                    // 上传文件
                    this.$axios.post("/upload/upload_CT/", fd, config).then(res => {
                        /*上传成功处理*/
                    }).catch(err => {/*报错处理*/});
                }
            }
        }
    }
</script>
上述组件就是全部配置内容啦⛄

如果对你有帮助请给我点个赞👍

如果有任何问题请留言给我😀

相关文章
|
5天前
|
JavaScript 前端开发 安全
Vue响应式设计
【5月更文挑战第30天】Vue响应式设计
26 1
|
2天前
|
JavaScript API
vue组合式和选项式
vue组合式和选项式
4 2
|
5天前
|
JavaScript 程序员 网络架构
vue路由从入门到进阶 --- 声明式导航详细教程
vue路由从入门到进阶 --- 声明式导航详细教程
vue路由从入门到进阶 --- 声明式导航详细教程
|
5天前
|
资源调度 JavaScript UED
vue路由的基础知识总结,vueRouter插件的安装与使用
vue路由的基础知识总结,vueRouter插件的安装与使用
|
5天前
|
JavaScript
|
5天前
|
编解码 JavaScript API
Vue在移动端的表现如何?
【5月更文挑战第30天】Vue在移动端的表现如何?
12 2
|
5天前
|
JavaScript 前端开发 API
Vue与其他框架的对比优势
【5月更文挑战第30天】Vue与其他框架的对比优势
11 1
|
6天前
|
JavaScript
Vue常用知识点总结
Vue常用知识点总结
13 0
|
7天前
|
JavaScript Java 测试技术
基于vue和微信小程序的校园自助打印系统+springboot+vue.js附带文章和源代码设计说明文档ppt
基于vue和微信小程序的校园自助打印系统+springboot+vue.js附带文章和源代码设计说明文档ppt
28 7
|
7天前
|
JSON JavaScript 前端开发