需求:
在文件满足条件时直接上传,再次上传时若文件满足条件则覆盖之前的文件上传,否则则提示且不上传不满足条件的文件。

<!-- :limit="1" --> // 注意:最大允许上传个数:这里不要置为1,置为1有个问题就是:无论怎么选择文件,页面上展示的始终是第一次选择的文件,这效果和我想的大相径庭。
<el-upload
   ref="upload"
   class="uploadBox"
   :action="$config.baseURL + '/resource/upload/images'"
   :http-request="handleFileUpload"
   :on-change="handleChange" 
   :auto-upload="false"   // 注意1
   :before-upload="beforeFileUpload"  // 注意2:
   :file-list="fileList"   //  上传的文件列表
   :show-file-list="isShowList"  // 是否显示已上传文件列表
   :on-remove="handleFileRemove"
 >
   <el-button type="primary" size="small" >上传文件</el-button>
   <div slot="tip" class="el-upload__tip">注:仅支持zip格式压缩文件</div>
 </el-upload>

:auto-upload:// 是否在选取文件后立即进行上传
:on-change:// 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
:before-upload: // 上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。
:http-request: // 覆盖默认的上传行为,可以自定义上传的实现
:on-remove: // 文件列表移除文件时的钩子

data() {
	return {
		isShowList:false,
		fileList:[ ]
	}
}

methods方法

// 点击上传文件的按钮:
  handleChange(file, fileList) {
	 // 限制大小在10MB之内
      let isLt10M = file.size / 1024 / 1024 < 10
      if(!isLt10M) {
        this.$message.error("上传文件大小不能超过 10MB!")
      }
      // 限制类型只能为zip
      let isResPackage = file.raw.type.includes('zip') // 是否为zip格式
      if(!isResPackage){
        this.$message.error("请上传正确格式的文件!")
      }
      // 只有两个条件都满足的时候,根据文件数量判断
      if(isResPackage && isLt10M) {
       // 若文件>1个,则取第二个文件上传
        if(fileList.length > 1) {
          this.fileList = [fileList[fileList.length - 1]]
          this.$nextTick(()=>{
           // 主动去调用提交接口
            this.$refs.upload.submit();
          })
          // 若文件只有一个,直接上传
        } else {
          this.$refs.upload.submit();
        }
        // 若任意不满足一个条件,则不进行上传动作,根据数量判断
      } else {
       // 若文件>1,则保留第一个上传的文件
        if(fileList.length > 1) {
          this.fileList = [fileList[0]]
          // 当只有当前这一个文件时,则清空文件列表
        } else {
          this.fileList = []
          // this.$refs.upload.clearFiles() // 清除前端显示的文件列表
        }
      }
    },
  //文件上传条件 
  beforeFileUpload(file) {
    console.log(file,'file的信息')
    //注意:当有如题的需求时,可把这里的限制逻辑移至:on-change钩子中
    // let isResPackage = file.type.includes('zip') // 是否为zip格式
    // let isLt10M = file.size / 1024 / 1024 < 10
    // if(!isResPackage){
    //   this.$message.error("请上传正确格式的文件!")
    // }
    // if(!isLt10M) {
    //   this.$message.error("上传文件大小不能超过 10MB!")
    // }
    // return isResPackage && isLt10M;
  },
  // 自定义文件上传
    handleFileUpload(e) {
      console.log(e.file);
      this.isShowList = true;
      const that = this;
      this.ossUpload(e.file, {
        progress: (p, checkpoint) => {
          //因为是el-upload组件自定义上传,若需要显示进度条,必须手动调用进度条方法
          that.progress = p;
          e.onProgress({ percent: Math.floor(p * 100) }); // 触发el-upload组件的onProgress方法
        }
      })
        .then(result => {
          console.log(result);
          let index = result.res.requestUrls[0].indexOf("?");
          if (index != -1)
            that.advSubmitData.extFile = result.res.requestUrls[0].substring(0, index);
          else that.advSubmitData.extFile = result.res.requestUrls[0];
          that.$message.success("文件上传成功");
        })
        .catch(e => {
          that.$message.error("文件上传失败");
        });
    },
    //移除上传文件
    handleFileRemove(file, fileList) {
      console.log(file,fileList);
      this.advSubmitData.extFile = "";
    },  

页面显示上面:用户选择第二个文件后,从第一个文件到第二个文件,有很明显的动态切换的效果,如果不想要,可以通过下面的css代码去覆盖:

<style lang="scss" scoped>
    .upload-demo {
      display: flex;
    }
    /deep/ .el-list-enter-active,
    /deep/ .el-list-leave-active {
      transition: none;
    }
 
    /deep/ .el-list-enter,
    /deep/ .el-list-leave-active {
      opacity: 0;
    }
    /deep/ .el-upload-list {
      height: 40px;
    }
</style>

注意,VUE3.0下/deep/的使用可能会有报错,比如我的项目就报错了:
这时可以把/deep/替换为::v-deep

[关于/deep/和>>>和::v-deep]

GitHub 加速计划 / eleme / element
54.06 K
14.63 K
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:3 个月前 )
c345bb45 7 个月前
a07f3a59 * Update transition.md * Update table.md * Update transition.md * Update table.md * Update transition.md * Update table.md * Update table.md * Update transition.md * Update popover.md 7 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐