项目需求:

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

问题点:

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

原因和解决方案

  • 大文件信息填写的之后可以将内容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. 项目测试中发现产品bug怎么办

    我所在的产品线,并非公司最大最强的产品 甚至为了推广我们这个产品,一般会拿给客户先免费试用 而在试用之前,是要经过一番通测的,测得很急,测得很快 所以产品bug非常多 那么在测试项目的时候,自然会发现 ...

  2. drf分页功能

    什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1 个接口,根据method的不 ...

  3. SQL中rownumber的用法

    1)一次排名: 语法:row_number() over(order by 字段 desc/asc):按照某个字段排名 1.1.查询语句: 1.2.查询结果:查询结果按照薪水进行排名 2)先分组后排名 ...

  4. BrowserSync(保存代码后,自动刷新浏览器)

    摘要 Browsersync能让浏览器实时.快速响应您的文件更改(html.js.css.sass.less等)并自动刷新页面.更重要的是 Browsersync可以同时在PC.平板.手机等设备下进项 ...

  5. 【python】提取sql语句中的表名

    前言 最近刚学python,写一个小工具时需要提取sql语句中表名,查询一番后找到一篇文章挺不错的,mark一下 PS.那篇文章是转载的,且没有标注转载自哪里 正文 import ply.lex as ...

  6. ajax js分页算法分析

    显示效果:[页面总数小于等于10,全部显示,当前页特殊显示]上一页  1   2   3   4   5   6   7   8   9   10   下一页 [页面总数大于10,部分显示,当前页特殊 ...

  7. Jquery 系列化表单

    大家知道Jquery中有serialize方法,可以将表单序列化为一个“&”连接的字符串,但却没有提供序列化为Json的方法.不过,我们可以写一个插件实现. 我在网上看到有人用替换的方法,先用 ...

  8. seldom之数据驱动

    seldom之数据驱动 如果自动化某个功能,测试数据不一样而操作步骤是一样的,那么就可以使用参数化来节省测试代码. seldom是我在维护一个Web UI自动化测试框,这里跟大家分享seldom参数化 ...

  9. tars之springboot的初步使用

    公司要求使用tars框架,现学习的,听老大讲的经验和看的一些技术博客,感觉和SpringCloud有些相似,不过内部有自己的规范,基于rpc实现的服务与服务之间的远程调用,而cloud的远程调用是基于 ...

  10. Swift 4.0 字典(Dictionary)学习

    定义字典常量(常量只有读操作) let dictionary1 = ["key1": 888, "key2": 999] let dictionary2: [S ...