使用elementUI的时候,使用Upload 上传的时候,使用 list-type 属性来设置文件列表的样式,before-upload方法失效...-程序员宅基地

技术标签: ViewUI  ui  javascript  

最近在做项目的时候,使用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)用来构建文件对象

 

转载于:https://www.cnblogs.com/chengxs/p/10114419.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30300523/article/details/95693876

智能推荐

科普帖:一起来聊聊开源数据库MongoDB-程序员宅基地

文章浏览阅读1k次,点赞26次,收藏21次。本教程向你介绍了MongoDB数据库。你将发现如何安装该软件、操作数据,并将数据设计技术应用于你自己的应用程序。

支付宝统一支付回调接口(适用于H5、PC、APP)_支付宝支付回调接口-程序员宅基地

文章浏览阅读1.9w次,点赞8次,收藏20次。支付宝统一支付回调接口(适用于H5、PC、APP)_支付宝支付回调接口

iOS判断手机中是否 有 SIM卡---备用-程序员宅基地

文章浏览阅读222次。[CTSIMSupportGetSIMStatus() isEqualToString:kCTSIMSupportSIMStatusNotInserted]可以判断是否插入了sim卡。前提是把下面的代码随便复制到一个头文件里面,然后引入CoreTelephony.framework即可。extern NSString* c*****t kCTSMSMessageReceivedNotifica..._ios 怎么判断手机有没有插卡

01 VoLTE - Introduction_cs network im cn subsystem-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏3次。What is VoLTE and Why?Voice Over LTE,,它是一种IP数据传输技术,无需2G/3G网络支持,全部业务承载于4G网络上,可实现数据与语音业务在同一网络下的统一。VoLTE的实现主要是基于IMS框架。语音在LTE网络中传输的几种解决方案Circuit-Switch Fallback (CSFB)可以在_cs network im cn subsystem

python 随机森林可视化_用python做随机森林需要安装那些库-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏17次。对随机森林进行可视化安装一些需要的库:pip install graphvizpip install pydotplus在Jupyter notebook 中进行随机森林可视化:from sklearn import datasetsfrom sklearn.ensemble import RandomForestClassifierfrom IPython.core.display import HTML, displayfrom sklearn import treeimport _用python做随机森林需要安装那些库

linux之开机自动挂载-程序员宅基地

文章浏览阅读71次。mount命令只能手动挂载磁盘,系统需要一个自动挂载磁盘的机制。即/etc/fstab。此文件的一些限制:/必须优先于其他mount point被挂载进来其他挂载点必须已经新建的目录所有挂载点同一时间内只能挂载一次所有分区在同一时间之内只能挂载一次[root@www~]#cat/etc/fstab##/etc/fstab#Cre..._mount: /media: failed to setup loop device for rhel-8.1-x86_64-dvd.iso.

随便推点

ROSubuntu实战:理解话题topics_ubuntu用什么指令查看话题数据-程序员宅基地

文章浏览阅读739次。1.准备工作1.1 roscore在新的终端中,运行roscore1.2 turtlesim运行turtlesim$ rosrun turtlesim turtlesim_node1.3 乌龟键盘遥操作我们需要有东西来操控乌龟移动。打开新的终端输入$ rosrun turtlesim turtle_teleop_key现在可以使用键盘的箭头按钮来控制乌龟移动。切记一定要在tu..._ubuntu用什么指令查看话题数据

2020 款大众朗逸车上坡低速转弯时发动机易熄-程序员宅基地

文章浏览阅读95次。正常情况下,发动机转速降低时,喷油脉宽应变小,由此怀疑发动机熄火是由供油不足引起的。,这说明虽然燃油泵电流降低,但燃油泵转速升高,由此推断此时燃油泵抽吸不到燃油,在空转,负载变小。接车后试车,起动发动机,发动机怠速运转正常,且组合仪表上没有故障灯点亮。所示,其中蓝色线为曲轴位置传感器信号,黄色线为进气歧管绝对压力传感器信号,红色线为气缸。喷油信号,绿色线为燃油压力,橙色线是根据曲轴位置传感器信号计算的发动机转速(利用。所示,其中蓝色线为曲轴位置传感器信号,黄色线为燃油泵电流,红色线为气缸。

matlab中的SVM_matlab svm函数-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏7次。Matlab SVM最近项目要用到SVM,时间紧,所以就直接用Matlab提供的库函数。另外,这个最负盛名的libsvm,台湾林智仁教授开发的开源包,http://www.csie.ntu.edu.tw/~cjlin/libsvm/业界很有名的一个包,有各种各样的接口,现在最新更新到Python。 Matlab中SVM的函数主要有两个:%svmtrain:s_matlab svm函数

google earth 卫星无偏移免费下载,91卫图助手_卫星助手等高线-程序员宅基地

文章浏览阅读2.6k次。google earth 卫星无偏移免费下载,91卫图助手91卫图助手下载器永久免费啦!!免费版就能轻松下载Google Earth等几十种无偏移影像、历史影像,及使用包含在线标注、投影转换(支持54,80,2000坐标系以及地方独立坐标系)在内的数十种功能,而且是永久免费的!!本软件可下载Google Earth影像、历史影像、陆地及海洋高程,矢量路网建筑地名点,全国乡镇及街区行政区划,影像无..._卫星助手等高线

32G内存服务器如何设置虚拟内存,大内存服务器设置虚拟内存-程序员宅基地

文章浏览阅读3.3k次。大内存服务器设置虚拟内存 内容精选换一换在性能优化时,需要遵循一定的原则,主要有以下几个方面:对性能进行分析时,要多方面分析系统的资源瓶颈所在,如CPU利用率达到100%时,也可能是内存容量限制,导致CPU忙于处理内存调度。一次只对一个性能指标参数进行调整。分析工具本身运行可能会带来资源损耗,导致系统某方面的资源瓶颈情况更加严重,应避免或降低对应用程序的影响。调优分析思路如下:性能优化首先要较为精..._32g内存最佳虚拟内存

在win8.1上用3proxy搭建socks4/4.5/5代理_windows 3proxy-程序员宅基地

文章浏览阅读1.2w次。3proxy是一个俄罗斯人编写的强大的代理软件,支持windows/linux/unix平台,支持网页协议文件传输协议HTTP/HTTPS/FTP代理,支持三个版本的套接字SOCKSv4/SOCKSv4.5/SOCKSv5(socks/socks.exe)代理,支持邮件协议POP3/SMTP代理,支持即时通讯协议AIM/ICQ(icqpr/icqpr.exe)代理,支持MSN 消息 / Live_windows 3proxy

推荐文章

热门文章

相关标签