项目需求:

  • 可上传多个文件
  • 可删除
  • 文件过大时用户输入可上传至其他网站,并将文件名和地址上传至本网站

问题点:

  • 大文件用户输入内容无法合并到已上传文件的列表进行展示
  • 上传多个大文件地址时前面已上传的大文件会被改变
  • 无法取消弹窗的代码校验

原因和解决方案

  • 大文件信息填写的之后可以将内容push到fileList, 并将值赋值给对应字段
  • 将对象push到数组, 是浅拷贝, 再次对对象进行赋值时, 数组中push的元素会被改变, 需要将浅拷贝改为深拷贝, 例如: push(JSON.parse(JSON.stringify(this.form)))
  • 我原本是想在弹窗出现时取消校验, 但是此时弹窗的DOM还未创建完成(可能是这个原因), 无法获取Dom, 会报错. 可以在点击弹窗的确定, 数据校验成功之后取消校验

所有原因及解决方案都在代码中有备注

element组件代码

<el-upload
class="upload-demo"
:action="actionUrl"
:on-success="handleAvatarSuccess2"
:before-upload="beforeAvatarUpload2"
multiple
:limit="5"
:on-exceed="handleExceed"
:before-remove="beforeRemove"
:on-remove="handleRemove"
:file-list="fileList"
>
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">
<!-- <p v-for="(itm, idx) of formDate.appendixSaveRequests" :key="idx">{{ itm.fileName }}</p>-->
</div>
</el-upload> <!-- 上传大文件附件时的弹窗-->
<el-dialog title="提示" :visible.sync="dialogFormVisible">
<p class="i-info">
<!-- <i class="el-icon-warning"></i>-->
如果您需要上传的附件过大,可上传至网盘,在此留下网盘地址</p>
<el-form :model="form" :rules="formRule" ref="form">
<el-form-item label="附件名称" prop="fileName" :label-width="formLabelWidth">
<el-input v-model="form.fileName" placeholder="请输入附件名称" autocomplete="off" />
</el-form-item>
<el-form-item label="附件地址" prop="fileUrl" :label-width="formLabelWidth">
<el-input v-model="form.fileUrl" placeholder="例:http://***.com" autocomplete="off" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取 消</el-button>
<el-button type="primary" @click="addBigFile">确 定</el-button>
</div>
</el-dialog>
// js部分
data () {
return {
dialogFormVisible: false,
form: { // 大文件输入的名称和地址
fileName: '',
fileUrl: '',
},
fileList: [],
}
},
methods: {
// 添加大文件
addBigFile() {
this.$refs.form.validate(valid => {
// 验证fileUrl地址和必填项非恐校验
var strRegex = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/|www\.)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/;
var re=new RegExp(strRegex);
if (valid && re.test(this.form.fileUrl)) {
this.dialogFormVisible = false
this.form.name = this.form.fileName
// this.form和this.fileList里的item都为对象类型, push相当于浅拷贝, 再次添加时this.form的值改变, 导致this.fileList里的值重复, 所以需要用深拷贝代替浅拷贝
let form = JSON.parse(JSON.stringify(this.form)) // 点击弹窗的确定时将弹窗中的内容push到fileList, 注意: push的字段名称要和fileList原本的字段名称一致
this.fileList.push(form)
this.resetForm('form')
} else {
this.$message.error('请输入正确的附件地址')
}
})
},
// 上传之前
beforeAvatarUpload2(file) {
const sizeFlag = file.size / 1024 / 1024 < 10
if (!sizeFlag) {
console.log(this.fileList, '=======')
this.dialogFormVisible = true
this.form.fileName = ''
this.form.fileUrl = ''
this.form.isThirdpartyStorage = true
}
return sizeFlag
},
// 上传成功
handleAvatarSuccess2(res, row) {
// console.log(res, row)
if (res.code === 0) {
// 下面为项目中上传附件的字段, 可忽略
this.formDate.appendixSaveRequests.push({
fileName: row.name,
name: row.name,
fileUrl: res.data.url,
isThirdpartyStorage: false
})
}
},
// 已删除
handleRemove(file, fileList) {
console.log('this.fileList=111111==')
// 编辑页面删除时要将后端返回的对应的字段内容删除
this.formDate.appendixSaveRequests.map((item, index) => {
if(item.uid === file.uid) {
this.formDate.appendixSaveRequests.splice(index, 1)
}
})
},
// 达到限制数量
handleExceed(files, fileList) {
this.$message.warning(`当前限制选择 5 个文件,本次选择了 ${files.length} 个文件`)
},
// 删除之前
beforeRemove(file, fileList) {
// return this.$confirm(`确定移除 ${file.name}?`)
} }

element的多文件上传的更多相关文章

  1. element 多个文件上传多次http请求解决方法

    第一步 action="#" 第二步 :auto-upload = "false" 第三步 给元素绑定click事件触发提交方法,注意,把其他没有用的文件都给去 ...

  2. element中文件上传

    vue+element 文件操作 作者:一粒尘土 时间:2019-3-17 注:以下操作针对 vue-cli 目录 使用 组件常用参数 组件常用方法 上传文件 上传文件格式限制 回显文件 下载文件 删 ...

  3. selenium -文件上传的实现 -对于含有input element的上传

    使用selenium做自动化时,我们经常会遇到的一个让人头疼的问题就是文件上传. 问题的难点在于selenium无法识别并操作Windows窗口,若我们可以绕过弹出框直接把文件信息上传给选择按钮,难点 ...

  4. vue+element UI + axios封装文件上传及进度条组件

    1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...

  5. vue + element 文件上传 并将文件转 base64

    当时有一个需求 是需要用到上传文件这个功能,并且需要将文件转为 base64 给到后台.网上找的全是啥图片转base64 肯定是因为这类需求比较常见.当时有点懵了.后面一想,都他娘是文件啊.然后就找到 ...

  6. 使用element UI el-upload组件实现视频文件上传及上传进度显示方法总结

    实现效果: 上传中: 上传完成: 代码: <el-form-item label="视频上传" prop="Video"> <!-- acti ...

  7. angularjs 文件上传 如何绑定file表单的change?

    ng-change 会失灵 , 唯一的解决方式 是 onchange="angular.element(this).scope().fileNameChanged()"然后利用 n ...

  8. jquery文件上传控件 Uploadify

    (转自 http://www.cnblogs.com/mofish/archive/2012/11/30/2796698.html) 基于jquery的文件上传控件,支持ajax无刷新上传,多个文件同 ...

  9. MVC5:使用Ajax和HTML5实现文件上传功能

    引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能. 基本功能:实现带有进度条的文件上传功 ...

随机推荐

  1. PAT-字符串处理-B 1002 写出这个数 (20分)

    题目: 思路: 先用字符串数组存储输入数字,然后依据num[i]-'0'对输入数字求和.然后对求和后的数字,进行分割,存储到数组中,然后遍历数组,依据存储汉语拼音的字符串二维数组进行输出 注意点: 注 ...

  2. 微信小程序转化为uni-app项目

    前言: 之前自己做一个uni-app的项目的时候前端需要实现一个比较复杂的功能,但是由于自己前端抠脚的原因没有写出来,然后自己在网上搜索的时候发现了有个微信小程序里面的页面及其的符合我的需求.那么问题 ...

  3. python学习-练习题兔子生长问题巩固

    有一对兔子,一个月之后成熟,成熟之后每个月会生出一对兔子,理想状态下兔子不会死,请问n个月后有多少兔子? 分析:第一个月:1 第二个月:1 第三个月:2 第四个月:3 第五个月:5 第六个月:8 从前 ...

  4. 服务器上监控tomcat,如果挂掉则重启

    该脚本用于监控tomcat服务器是否可用,如果服务不可用则重启tomcat 略微修改后也可以用于其他服务的监控 monitor.sh 脚本如下 #!/bin/sh # 定义要监控的页面地址 WebUr ...

  5. Oracle 11g rac中关于crsctl stop cluster/crs/has的区别

    转载至http://www.oracleplus.net/arch/1203.html,整理后得. 1 通过命令查看cluster/has/crs管理的内容 [root@11rac1 ~]# crsc ...

  6. 回想笔记 瞎比比 域名注册 解析绑定ip 下载证书 设置证书 重定向http到https请求

    2019.7.27 回想笔记 拥有腾讯云服务器一台 阿里云注册5元域名,进行备案 完成之后 使用解析 绑定服务器ip地址 ,使用域名可以访问到web服务器而不是通过直接暴露ip地址进行访问 证书购买 ...

  7. Java集合01——List 的几个实现类,了解一下?

    从本文起,我们将开始分享 Java 集合方面的知识,关注公众号「Java面典」了解更多 Java 知识点. List 是继承于 Collection 的接口,其实现类有 ArrayList,Linke ...

  8. C++ 函数模板/类模板

    #include <iostream> #include <vector> using namespace std; template < class T > // ...

  9. 【Weiss】【第03章】练习3.2

    [练习3.2] 给你一个链表L和另一个链表P,它们包含以升序排列的整数.操作printlots(L,P)将打印L中那些由P所指定的位置上的元素. 例如,如果p=1,3,4,6,那么,L的第一.第三.第 ...

  10. Collection-接口中的方法(新手)

    /* Collection 接口中的方法 ArrayList implements List 数组列表 实现 列表 List extends Collection 列表 继承 数组列表*///导入包. ...