您当前的位置:首页 > 网站建设 > javascript
| php | asp | css | H5 | javascript | Mysql | Dreamweaver | Delphi | 网站维护 | 帝国cms | React | 考试系统 | ajax | jQuery | 小程序 |

vue+el-upload实现多文件动态上传

51自学网 2022-02-21 13:39:41
  javascript

vue+el-upload多文件动态上传,供大家参考,具体内容如下

使用场景

点击【添加/删除】,可动态增加/删除行数,并为每行上传附件,附件暂存前端,点击【上传】可以将所有附件和部分名称同时提交后台,实现表格的动态多文件上传。其中el-upload ,相关钩子函数可查看el-upload 官方文档

这里的表格行的新增是在弹框中填完再写入的,也可直接在表格中添加行,然后填写内容(template slot-scope=“scope” 注释部分代码),这里仅提供思路

代码html部分

<div class="vue-box">           <div class="title-line">                            其他必须持有的证照<el-button type="primary" size="mini" style="height: 20px;padding-top: 3px !important;margin-left: 50px" icon="el-icon-plus" @click="handleAddDetails">添加行</el-button>                            <el-button type="primary" size="mini" style="height: 20px;padding-top: 3px !important;margin-left: 50px" icon="el-icon-plus" @click="doFileUpload()">上传</el-button>            </div>            <el-table                    :row-class-name="rowClassNameDeal"                    :data="tableData"                    style="width: 100%;">                <el-table-column                        prop="id"                        width="50"                        label="序号">                </el-table-column>                <el-table-column                        prop="cardName"                        width="180"                        label="证照名称">                    <!--<template slot-scope="scope">                        <el-input size="mini" v-model="tableData[scope.row.id-1].cardName"></el-input>                    </template>-->                </el-table-column>                <el-table-column                        prop="cardNo"                        width="180"                        label="证件号码">                    <!--<template slot-scope="scope">                        <el-input size="mini" v-model="tableData[scope.row.id-1].cardNo"></el-input>                    </template>-->                </el-table-column>                <el-table-column                        prop="startDate"                        width="180"                        label="起始日期">                    <!--<template slot-scope="scope">                        <el-date-picker                                v-model="tableData[scope.row.id-1].startDate"                                style="width: 80%;"                                size="mini"                                value-format="yyyy-MM-dd"                                type="date"                                placeholder="选择日期">                        </el-date-picker>                    </template>-->                </el-table-column>                <el-table-column                        prop="endDate"                        width="180"                        label="结束日期">                    <!--<template slot-scope="scope">                        <el-date-picker                                v-model="tableData[scope.row.id-1].endDate"                                style="width: 80%;"                                size="mini"                                value-format="yyyy-MM-dd"                                type="date"                                placeholder="选择日期">                        </el-date-picker>                    </template>-->                </el-table-column>                <el-table-column                        prop="address"                        label="附件">                    <template slot-scope="scope">                        <el-upload                                :ref="scope.row.cardName"                                :http-request="dynamicUpload"                                :before-upload="beforeUploadFile(scope.row)"                                :on-remove="uploadRemove"                                :before-remove="uploadBeforeRemove"                                :on-preview="uploadPreview"                                name="upload"                                :limit="1"                                :data="scope.row.cardName"                                :on-exceed="uploadHandleExceed"                                :file-list="tableData[scope.row.id-1].fileUploadedList">                            <el-button  size="mini" type="info">点击上传</el-button>                        </el-upload>                    </template>                </el-table-column>                <el-table-column                        prop="date"                        width="80"                        label="操作">                    <template slot-scope="scope">                        <el-button size="mini" type="warning" @click="handleDeleteDetails(scope.row)">删除</el-button>                    </template>                </el-table-column>            </el-table>                        <el-dialog title="证照信息" :visible.sync="addCardVisible" width="40%">                <el-form :model="fileInfo">                    <el-form-item label="证照名称" :label-width="labelWidth">                        <el-input v-model="fileInfo.cardName" autocomplete="off" style="width: 100%;"></el-input>                    </el-form-item>                    <el-form-item label="证件号码" :label-width="labelWidth">                        <el-input v-model="fileInfo.cardNo" autocomplete="off" style="width: 100%;"></el-input>                    </el-form-item>                    <el-form-item label="生效日期" :label-width="labelWidth">                        <el-date-picker type="date" placeholder="生效日期" value-format="yyyy-MM-dd" v-model="fileInfo.startDate" style="width: 100%;"></el-date-picker>                    </el-form-item>                    <el-form-item label="失效日期" :label-width="labelWidth">                        <el-date-picker type="date" placeholder="失效日期" value-format="yyyy-MM-dd" v-model="fileInfo.endDate" style="width: 100%;"></el-date-picker>                    </el-form-item>                </el-form>                <div slot="footer" class="dialog-footer">                    <el-button @click="addCardVisible = false">取 消</el-button>                    <el-button type="primary" @click="addFileDetail">确 定</el-button>                </div>            </el-dialog></div>

js部分代码

let nodeVue = new Vue({    el: '.vue-box',    data: {        labelWidth: '150px',        tableData: [],        uploadParams:{            fileTagName: ''        },        totalFileList:[],        totalFileNameList:[],        addCardVisible:false,        fileInfo:{            cardName:'',            cardNo:'',            startDate:'',            endDate:''        }    },    methods:{        // 文件相关        uploadRemove:function(file) {            let that = this;            // 删除文件列表中的文件            for(let i=0;i<that.totalFileNameList.length;i++){                if(that.totalFileNameList[i].fileName === file.name){                    that.totalFileNameList.splice(i,1)                }            }            for(let i=0;i<that.totalFileList.length;i++){                if(that.totalFileList[i].name === file.name){                    that.totalFileList.splice(i,1)                }            }        },        // 上传文件参数设置        beforeUploadFile:function(row) {            console.log(row.cardName);            this.uploadParams.fileTagName=row.cardName            this.uploadParams.fid=row.id        },        // 下载文件,点击文件列表中的文件下载        uploadPreview:function(file){            console.log(file);        },        uploadHandleExceed:function(files, fileList) {            this.$message.warning(`当前限制选择 1 个文件`);        },        uploadBeforeRemove:function(file) {            return this.$confirm(`确定移除 ${ file.name }?`);        },        // 附件添加行,打开添加行弹框        handleAddDetails(){            let that = this;            that.addCardVisible = true;            that.fileInfo.cardName = '';            that.fileInfo.cardNo = '';            that.fileInfo.startDate = '';            that.fileInfo.endDate = '';        },        // 向表格数据中添加一行        addFileDetail(){            let that = this;            if (that.tableData == undefined) {                that.tableData = new Array();            }            let obj = {};            obj.id = 0;            obj.cardName = that.fileInfo.cardName;            obj.cardNo = that.fileInfo.cardNo;            obj.startDate = that.fileInfo.startDate;            obj.endDate = that.fileInfo.endDate;            obj.fileUploadedList=[];            that.tableData.push(obj);            that.addCardVisible = false;        },        // 删除行        handleDeleteDetails(row){            let that = this;            that.tableData.splice(row.id-1, 1);            //同时 删除文件列表及关联列表中的数据            let tmpFileName = '';            for(let i=0;i<that.totalFileNameList.length;i++){                if(that.totalFileNameList[i].cardName === row.cardName){                    tmpFileName = that.totalFileNameList[i].fileName;// 先暂存再执行删除操作                    that.totalFileNameList.splice(i,1);                }            }            for(let i=0;i<that.totalFileList.length;i++){                if(that.totalFileList[i].name === tmpFileName){                    that.totalFileList.splice(i,1)                }            }        },        rowClassNameDeal({row, rowIndex}) {             //把每一行的索引放进row.id,此方法用于生成表格中的序号,当在表格中填写内容时,每一行都需要绑定不同的v-model            row.id = rowIndex+1;        },        // 自定义上传,只将文件暂存在前端        dynamicUpload(content){            let that = this;            if(content.data.length === 0){                that.$message.warning(`请填写证照名称!!!`);                that.$refs[content.data].clearFiles();                return false;            }            for(let i=0;i<that.totalFileNameList.length;i++){                if(that.totalFileNameList[i].fileName === content.file.name){                    that.$message.warning('改文件已上传,请重新选择文件上传!!!');                    that.$refs[content.data].clearFiles();                    return false;                }            }            // 将文件加入到待传输的文件列表            that.totalFileList.push(content.file)            let fileNameData = {                cardName: content.data,                fileName: content.file.name            }            // totalFileNameList 存储文件和表格内容的关联关系,这里只关联了证照名称            that.totalFileNameList.push(fileNameData)        },        // 执行上传操作将文件和表格信息一起发送到后台        doFileUpload(){            let that = this;            if(that.totalFileList.length === 0){                that.$message.warning("请上传文件!!!");                return;            }            // 上传文件需要用FormData,processData和contentType 两个参数必须设置,否则上传不成功            const params = new FormData();            // 为上传的每个文件命名,方便后台获取时与表格数据关联            for (let i = 0; i < that.totalFileList.length; i++) {                params.append(that.totalFileList[i].name, that.totalFileList[i]);            }            params.append("fileNameList", JSON.stringify(that.totalFileNameList));            $.ajax({                url:baseurl+"/testupload/fileUpload",                type:"POST",                dataType: "json",                processData: false, //用于对data参数进行序列化处理 这里必须false                contentType: false, //必须                data:params,                success:function(res){                    that.$message.warning('上传成功');                }            });        }    },    created: function(){           }})

后台接收代码

@Controller@RequestMapping("/testupload")public class RegisterController { // 附件从 request中获取    @RequestMapping("/fileUpload")    @ResponseBody    public ServerResponse fileupload(HttpServletRequest request,String fileNameList){        try{            if(fileNameList == null){                throw new Exception("请选择文件后上传!!!");            }            // 1. 上传的位置            String path = "E://uploadfile";            //判断该路径是否存在            File file = new File(path);            if (!file.exists()) {                file.mkdirs();            }            // 处理以字符串形式上传的关联数据信息            JSONArray jsonArray = JSON.parseArray(fileNameList);            // 遍历关联列表            for(Object object : jsonArray){                JSONObject jsonObject = JSON.parseObject(object.toString());                System.out.println(jsonObject.getString("cardName"));                // 获取文件                MultipartFile file1 = ((MultipartHttpServletRequest) request).getFile(jsonObject.getString("fileName"));                // 获取文件信息                String filename = file1.getOriginalFilename();                System.out.println(filename);                // 保存文件                file1.transferTo(new File(path, filename));            }        }catch (Exception e) {            log.error(e.getMessage());            return ServerResponse.createByErrorMessage(e.getMessage());        }        return ServerResponse.createBySuccess();    }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持51zixue.net。


下载地址:
vue中混入mixins的使用方法
vue/react单页应用后退不刷新方案
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。