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>

上述组件就是全部配置内容啦⛄

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

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