mengjoy / bugCheck

主要用来记录写项目中遇到的问题
0 stars 0 forks source link

Element中使用http-request覆盖组件提交 #1

Open mengjoy opened 4 years ago

mengjoy commented 4 years ago

1、需求描述

2、七牛云上传

3、使用的组件

4、过程 既然使用http-request干掉了本身的提交功能,那么需要将auto-upload这个属性置为false,before-upload应该是不能用了,所以使用on-change这个事件去监听文件的变化,当on-change变化的时候去请求后段的接口获取token,因为上传到七牛云的时候需三个必须的必须的参数(file,key,token),key和token都是后端返回的,file是on-change事件的一个默认参数,这三个三处都有了的时候,需要手动提交,才能上传,手动提交使用了submit() ,当submit提交之后才能执行http-request定义的方法。 http-request绑定的事件方法里面主要是处理了上传七牛云的请求,这里需要注意上传非json数据的时候需要将'Content-Type':字段设置成'multipart/form-data',以及提交七牛云所需要的数据的时候,使用formData格式上传的,这里需要先new FormData() ,使用append('key',value)这个方法将所需要的参数添加,完成之后,发送请求,七牛云会返回一个key,将baseurl+key就是图片的链接。

5、遇到问题

6、代码粘贴

<template v-for="(prove,index) in form.proves">
    <el-upload 
         ref="uploadProve"
         action="http://upload.qiniup.com/"
         :auto-upload="false"
         list-type="picture-card"
         :show-file-list="false"
         :on-change="(file,fileList) => changeUpload(file, fileList, 'uploadProve',index)"
         :http-request="(req) => uploadImageQiNiu(req,index,'proof_file')"
         class="avatar-uploader">

         <img v-if="prove['proof_file']" :src="prove['proof_file']" class="avatar">
         <i v-else class="el-icon-plus avatar-uploader-icon"></i>
     </el-upload>
</template>

changeUpload(file,refs,index) {
    axios.get(http://获取token的url)).then((res)=>{
    this.data['upload_token'] = res.data.data.token
    this.data['key'] = res.data.data.key
    this.$refs[refs][index].submit()
  }).catch((err) => {
this.$message.error({
    message: err.message
  })
 }).finally(() => {
this.$refs[refs][index].clearFiles()
 })
},

uploadImageQiNiu(req, index, imgName) {
    let formData = new FormData()
   let config= {
     'Content-Type': 'multipart/form-data'
    }
   formData.append('file', req.file)
   formData.append('key', this.data['key'])
   formData.append('token', this.data['upload_token'])

  axios.post('https://upload-z1.qiniup.com/', formData, config)
  .then((res) => {
    let imgUrl = `https://baseurl/${res.data.key}`
    this.form.proves[index][imgName] = imgUrl
  })
},

------------------------··································-bug补充··································································--------- 昨晚发现,如果我上传多次的话,在uploadImageQiNiu中会把所有的change过的file全部上传,但是不能限制limit,所以采用了在每次获取到token的之后就将fileList清除掉,这样只会上传 成功获取tokende文件。