项目需求:

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

问题点:

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

原因和解决方案

  • 大文件信息填写的之后可以将内容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. cocoapods相关的知识点

    目录 1.安装和卸载cocoapods 安装 卸载 2.常规问题解决思路 50%报错问题可以通过 pod install或者pod update解决 指定swift编译版本 由于墙的原因,可能会ins ...

  2. I - A计划 HDU - 2102

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. java后台生成并下载二维码

    这个功能在项目开发中是很基础的,平时用到的也很多,这里简单记录一下,以便以后使用的时候参考 前提业务要求:前台页面展示数据,有下载按钮,点击下载,下载对应数据的二维码. 首先,在pom.xml文件中添 ...

  4. nginx前端服务部署

    一.登录服务器 登录跳板机 执行list,列出所有机器 执行dssh 机器序号,如dssh 1,选择机器 二. 创建nginx配置文件 进入nginx配置目录:cd usr/local/nginx/c ...

  5. 3DGIS与BIM集成集成技术及铁路桥梁可视化系统

    3DGIS与BIM的集成技术 3DGIS与BIM的集成技术包括2部分:一是将Revit软件生成的BIM针对3DGIS的快速无损格式转换,这种转换包括几何信息(如形状.位置等信息)和属性信息(如建筑信息 ...

  6. PHP的for循环

    For循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块.for循环用于您预先知道脚本需要运行的次数的情况 for(初始值:条件:增量) { 要执行的代码: } <html> ...

  7. C++ 选择排序的理解

    #include<stdio.h> #include <iostream> using namespace std; void swap(int *a, int *b) //元 ...

  8. pytorch的自动求导机制 - 计算图的建立

    一.计算图简介 在pytorch的官网上,可以看到一个简单的计算图示意图, 如下. import torchfrom torch.autograd import Variable x = Variab ...

  9. 神器cut基因剪

    cut cut 不就是切嘛,没错就是它--我给他起了一个外号基因剪刀 来我们学一下怎么使用这个命令 cut --help [root@ESProbe ~]# cut --help Usage: cut ...

  10. jenkins-gitlab-harbor-ceph基于Kubernetes的CI/CD运用(四)

    前景提要 jenkins与gitlab结合,实现代码自动拉取:https://www.cnblogs.com/zisefeizhu/p/12548662.html jenkins与kubernetes ...