使用element-plus的el-upload:1.手动上传2.第二次上传无效3.多图上传保留成功去除失败4.请求头添加token5.请求添加其他参数

 <el-upload
  :action="uploadImgUrl"
  :auto-upload="false"
  list-type="picture-card"
  v-model:file-list="resFileList"
  :on-success="uploadImgSuccess"
  :on-error="handleError"
  ref="resUpload"
  :headers="headers"
  :data="uploadData"
  >
  <p>点击上传</p>
</el-upload>
<el-button @click="submit">确认上传</el-button>

手动上传

设置:auto-upload="false"不自动上传文件

点击确认上传时再进行图片上传

submit() {
  this.$refs["resUpload"].submit()
  }

第二次上传无效

按照上方的代码写,会发现只能上传第一次会触发请求接口,再点就没反应了

网上搜,基本都是让调组件的clearFiles方法清除文件列表,但是我的需求是,上传完保留上次上传的图片,供下次继续上传,所以不符合我的需求

this.$refs["resUpload"].clearFiles()

仔细研究下,发现实际上是因为el-upload绑定的文件列表变量(比如上方代码是resFileList)中的每个文件对象的status属性值不是ready

选择文件后还没上传,这时打印文件列表变量,每个文件对象的status值是ready

上传文件后打印文件列表变量,根据上传情况,每个文件对象的status值会被更改为success,fail,uploading这三种,而只有ready值的文件对象会被this.$refs["resUpload"].submit()提交

所以,想上传完保留上次上传的图片供下次继续上传,可以这样写

 this.resFileList.forEach(item => {
  item.status = "ready"
})

多图上传

el-upload组件默认多图上传是多次调用上传图片接口

通过判断文件列表的status都是success判断正常调用上传接口了

调用上传接口不代表上传就成功了,再判断code===200(根据个人的后端接口规范)判断图片都上传成功了

    // on-success文件上传成功时的钩子,上传三张图片就会触发三次这个钩子
    async uploadImgSuccess(response) {
      // 每次上传返回code不对,就相应报错(根据个人的后端接口规范调整)
      if (response.code !== 200) {
        this.$message.error(response.msg)
      }
      // 通过判断上传文件列表数组的status全为success来判断所有图片都上传了
      if (this.fileList.every(item => item.status === "success")) {
        // 所有图片都上传成功,才执行后续方法
        if (this.fileList.every(item => item.response.code === 200)) {
          ...
        }
        // 如果有图片未上传成功,就过滤掉不成功的,保留成功的,让用户再次选择
        else {
          this.fileList = this.fileList.filter(item => item.response.code === 200)
          // fix:el-upload组件第二次点击上传无效
          // 因为el-upload组件的上传会判断文件列表的status状态,如果不是ready,则不会上传
          this.fileList.forEach(item => {
            item.status = "ready"
          })
        }
      }
    },

请求头添加token

el-upload组件的headers属性,绑定一个对象就可以了

data() {
    return {
      headers: { token: localStorage.getItem("token") }
    }
  },

请求添加其他参数

el-upload组件的data属性,绑定一个对象就可以了

data() {
    return {
      uploadData: {}
    }
  },

例如,后端希望我每次再传一个uuid

const id = this.uuid()
this.uploadData = {
  id
}
this.$refs["resUpload"].submit()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值