最近在做项目的时候,使用elementUI的时候,使用Upload 上传的时候,before-upload方法失效。

情况下:使用 list-type 属性来设置文件列表的样式。

最终的优化之后:(演示的是修改)

需求:

1、已经提交的附件不可删除,新上传的附件可以删除

2、图片附件不能上传其他格式的文件,一次可以多张上传图片,最多上传3张,最大不超过2M

3、文件附件不能上传除了图片格式以外的格式,一次可以上传多个文件,最多上传3个文件,最大不超过2M

4、手动上传文件

一、使用on-change方法来模拟before-upload方法来判断文件类型或大小

查找了资料发现还是不行,只能求助大佬们?

  <el-form-item prop="image" label="图片附件上传">
<el-upload
ref="uploadImage"
:action="uploadAction"
:before-upload="beforeUploadPicture"
:before-remove="beforeRemovePicture"
:on-change="imageChange"
list-type="picture-card"
name="files"
:file-list="eventDetail.images"
:limit="3"
multiple
:auto-upload="false"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemovePicture"
:on-exceed="handleExceedPicture">
<i class="el-icon-plus"></i>
</el-upload>
<el-dialog append-to-body title="图片详情" :visible.sync="dialogVisible">
<img width="100%" :src="dialogImageUrl" alt="">
</el-dialog>
</el-form-item>

最后只能使用on-change来模拟before-upload方法的判断上传的照片或者文件的格式。

//这个是before-upload方法,来判断上传文件    beforeUploadPicture(file){
// console.log(file, fileList, '=============================')
const isImage = file.raw.type == 'image/png' || file.raw.type == 'image/jpg' || file.raw.type == 'image/jpeg' || file.raw.type == 'image/bmp' || file.raw.type == 'image/gif' || file.raw.type == 'image/webp';
const isLt2M = file.size < 1024 * 1024 * 2;
if (!isImage) {
this.$message.error('上传只能是png,jpg,jpeg,bmp,gif,webp格式!');
}
if (!isLt2M) {
this.$message.error('上传图片大小不能超过 2MB!');
}
return isImage && isLt2M;
},

******然后这个方法失效,on-change方法正常。我只能使用on-change方法来******

//on-change的方法 imageChange(file, fileList) {
const isImage = file.raw.type == 'image/png' || file.raw.type == 'image/jpg' || file.raw.type == 'image/jpeg' || file.raw.type == 'image/bmp' || file.raw.type == 'image/gif' || file.raw.type == 'image/webp';
const isLt2M = file.size < 1024 * 1024 * 2;
if (!isImage) {
this.$message.error('上传只能是png,jpg,jpeg,bmp,gif,webp格式!');
}
if (!isLt2M) {
this.$message.error('上传图片大小不能超过 2MB!');
}
if(isImage && isLt2M){
this.imageList = fileList;
this.images[''] = fileList;
}else{
fileList.splice(-1,1);
}
},

以上是图片附件的:使用on-change方法模拟before-upload方法,使用splice删除文件,splice方法是可以改变原始数组的,这样就模拟了上传前判断文件格式。

文件附件的方法跟这个类似,改一下方法名就行

二、已经保存的文件不可删除,怎么判断

思路:我本来是打算从列表中根据单子状态来判断,然后发现我新上传的文件,也删除不了,所以最后使用文件的url路径来判断是不是已经保存的,因为这是手动保存,文件路径如果不是服务器地址而是本地地址,就可以判断为这是新上传的文件,就可以删除。

使用before-remove方法

    beforeRemovePicture(file, fileList){
if(file.url.indexOf('blob') === -1){
this.$message.warning('已提交的服务单的附件不能删除')
return false;
}
},

三、手动上传文件和附带其他参数

思路:可以自己构建FormData数据,使用append方法构造一个文件对象,并且将其他参数加入到文件对象

手动上传方法(构造FormData文件对象

let wfForm = new FormData();
wfForm.append('orderId', this.eventDetail.orderId)
wfForm.append('eventCategory', this.eventDetail.eventCategory)
wfForm.append('priority', this.eventDetail.priority==null?'':this.eventDetail.priority)
wfForm.append('title', this.eventDetail.title)
wfForm.append('dsc', this.eventDetail.dsc==null?'':this.eventDetail.dsc)
wfForm.append('occurDate', this.eventDetail.occurDate==null?'':this.eventDetail.occurDate)
let attIds = ''
for (let i = 0, length = this.eventDetail.files.length; i < length; i++) {
attIds += this.eventDetail.files[i].attId + ',';
}
for (let i = 0, length = this.eventDetail.images.length; i < length; i++) {
attIds += this.eventDetail.images[i].attId + ',';
}
attIds = attIds.substring(0, attIds.length - 1);
wfForm.append('attIds', attIds);
Object.entries(this.images).forEach(file => {
file[1].forEach(item => {
wfForm.append('file', item.raw)
wfForm.append(item.name, file[0])
})
})
Object.entries(this.files).forEach(file => {
file[1].forEach(item => {
wfForm.append('file', item.raw)
wfForm.append(item.name, file[0])
})
})

说明一下:

1、this.images指的是新上传的图片的数组,this.files值的是新上传的文件的数组。

2、Object.entries方法主要是用来遍历对象属性。

3、wfForm.append('file', item.raw)用来构建文件对象

使用elementUI的时候,使用Upload 上传的时候,使用 list-type 属性来设置文件列表的样式,before-upload方法失效的更多相关文章

  1. 使用Element的upload上传组件,不使用action属性上传

    1.需要实现的效果如下图,在点击提交的时候再提交file数据,和其他数据统一上传,我把file转换成了base64的格式,可以再上传之前显示缩略图 2.代码分析 action属性值为"#&q ...

  2. Upload 上传

    通过点击或者拖拽上传文件 点击上传 通过 slot 你可以传入自定义的上传按钮类型和文字提示.可通过设置limit和on-exceed来限制上传文件的个数和定义超出限制时的行为.可通过设置before ...

  3. upload 上传类

    <?php/**file: fileupload.class.php 文件上传类FileUpload本类的实例对象用于处理上传文件,可以上传一个文件,也可同时处理多个文件上传 */class U ...

  4. UI标签库专题四:JEECG智能开发平台 Upload(上传标签)

     1. Upload(上传标签) 1.1.  參数 属性名 类型 描写叙述 是否必须 默认值 id string 上传控件唯一标示 是 null name string 控件name 是 null ...

  5. 页面中使用多个element-ui upload上传组件时绑定对应元素

    elemet-ui里提供的upload文件上传组件,功能很强大,能满足单独使用的需求,但是有时候会存在多次复用上传组件的需求,如下图的样子,这时候就出现了问题,页面上有多个上传组件时,要怎么操作呢? ...

  6. element-ui Upload 上传组件源码分析整理笔记(十四)

    简单写了部分注释,upload-dragger.vue(拖拽上传时显示此组件).upload-list.vue(已上传文件列表)源码暂未添加多少注释,等有空再补充,先记下来... index.vue ...

  7. element-ui upload上传组件问题记录

    element-ui upload上传组件遇到的问题

  8. element-ui upload上传文件并携带参数 使用formData对象

    需求:上传文件的时候,需要携带其他的参数 问题:使用upload上传文件时,必须使用formData对象,而其他的参数通过data获取的到的,formData和data是不能同时传输的 解决:获取到的 ...

  9. 封装Vue Element的upload上传组件

    本来昨天就想分享封装的这个upload组件,结果刚写了两句话,就被边上的同事给偷窥上了,于是在我全神贯注地写分享的时候他就神不知鬼不觉地突然移动到我身边,腆着脸问我在干啥呢.卧槽你妈,当场就把我吓了一 ...

随机推荐

  1. Pascal Triangle

    Description: Given numRows, generate the first numRows of Pascal's triangle. For example, given numR ...

  2. Sass快速入门学习笔记

    1. 使用变量; sass让人们受益的一个重要特性就是它为css引入了变量.你可以把反复使用的css属性值 定义成变量,然后通过变量名来引用它们,而无需重复书写这一属性值.或者,对于仅使用过一 次的属 ...

  3. ArcGis SOE(server object extensions)之REST Template初体验

    一.安装vs和arcgis server for .net(本例是vs2010.as 10),然后打开vs新建一个项目

  4. 解决AES算法CBC模式加密字符串后再解密出现乱码问题

    问题 在使用 AES CBC 模式加密字符串后,再进行解密,解密得到的字符串出现乱码情况,通常都是前几十个字节乱码: 复现 因为是使用部门 cgi AESEncryptUtil 库,找到问题后,在这里 ...

  5. jieba库分词

    (1)团队简介的词频统计 import jieba import collections s="制作一个购票小程序,这个购票小程序可以根据客户曾经的购票历史" s+="和 ...

  6. 洛谷 P1691 解题报告

    P1691 有重复元素的排列问题 题目描述 设\(R={r_1,r_2,--,r_n}\)是要进行排列的\(n\)个元素.其中元素\(r_1,r_2,--,r_n\)可能相同.使设计一个算法,列出\( ...

  7. PAT1101:Quick Sort

    1101. Quick Sort (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CAO, Peng There is a ...

  8. SpringMVC表当重复提交

    最近公司上线,有同志进行攻击,表当防重复提交也没有弄,交给我 ,本人以前也没弄过,知道大概的思路,但是那样实在是太麻烦了,虽然后面试过使用过滤器加拦截器实现,不过还是有点小麻烦. 后来在网上搜索后发现 ...

  9. mysql的内建日期处理函数

    下面的表格列出了MySQL 中最重要的内建日期函数: 函数 描述 NOW() 返回当前的日期和时间 CURDATE() 返回当前的日期 CURTIME() 返回当前的时间 DATE() 提取日期或日期 ...

  10. 附近的人,附近的卖家(geohash+前缀树)

    http://www.cnblogs.com/LBSer/p/3310455.html http://blog.csdn.net/shixiaoguo90/article/details/253137 ...