当前位置:主页 > 网页前端 > vue >

el-upload http-request使用 多个文件上传携带其他参数方式

时间:2022-10-20 10:15:01 | 栏目:vue | 点击:

el-upload http-request使用

1、http-request:覆盖默认的上传行为,可以自定义上传的实现

2、不需要给action关联上传的地址,但是action这个属性必须写

3、在http-request自定义上传事件中将上传文件保存到一个数组中

4、 接口使用formData表单数据格式传参, 将上传的文件和其他参数一起传给接口,使用的方法是new FormData()

4、如果是单文件上传并携带参数,可以直接在http-request自定义事件中调用后端接口

多文件上传携带参数完整代码参考如下: 

<template>
  <div>
    <el-form
      :model="formData"
      label-width="80px"
    >
      <el-form-item
        label="科目名称"
        prop="name"
      >
        <el-input v-model="formData.name" />
      </el-form-item>
      <el-form-item label="上传文件">
        <el-upload
          action
          :http-request="httpRequest"
          :before-upload="beforeUploadClick"
          :on-exceed="handleExceed"
          :limit="2"
          multiple
          :show-file-list="false"
        >
          <el-button
            slot="trigger"
            size="small"
            type="primary"
          >选取文件</el-button>
        </el-upload>
      </el-form-item>
      <el-form-item>
        <el-button
          type="primary"
          @click="saveClick"
        >保存</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>
<script>
import axios from 'axios'
export default {
  data() {
    return {
      formData: { name: '' },
      fileList: []
    }
  },
  methods: {
    // 重写文件上传方法,覆盖原有的上传方法,将上传的文件依次添加到fileList数组中
    httpRequest(option) {
      this.fileList.push(option)
    },
     // 上传前处理
    beforeUploadClick(file) {
    },
    // 文件数量过多时提醒
    handleExceed() {
      this.$message({ type: 'info', message: '最多支持2个附件上传' })
    },
    // 表单提交
    async saveClick() {
      // 使用form表单的数据格式
      const paramsData = new FormData()
      // 将上传文件数组依次添加到参数paramsData中
      this.fileList.forEach((it, index) => {
        paramsData.append(`file${index}`, it.file)
      });
      // 将表单数据添加到参数paramsData中
      paramsData.append('name', this.formData.name)
      // 表单数据和文件一起上传,调用后端接口
      const res = await axios({
        url: '后端接口地址',
        method: 'post',
        data: paramsData
      })
    }
  }
}
</script>

el-upload自定义http-request上传踩坑

el-upload自定义上传的坑

:http-request 指令的使用

使用该指令, :on-success, :on-error 指令是不会触发的

<el-form-item label="logo" prop="logo">
        <el-upload
          class="upload-demo"
          ref="upload"
          action="string"
          accept="image/jpeg,image/png,image/jpg"
          list-type="picture-card"
          :before-upload="onBeforeUploadImage"
          :http-request="UploadImage"
          :on-change="fileChange"
          :file-list="fileList"
        > 
          <el-button size="small" type="primary">点击上传</el-button>
          <div slot="tip" class="el-upload__tip">只能上传jpg/jpeg/png文件,且不超过500kb</div>
        </el-upload>
      </el-form-item>

说明:

还可以解决这个问题 limit设置为1, 点击上传不起效果

data() {
    fileList: [],
    logo: '',
}
methods: {
    onBeforeUploadImage(file) {
      const isIMAGE = file.type === 'image/jpeg' || 'image/jpg' || 'image/png'
      const isLt1M = file.size / 1024 / 1024 < 1
      if (!isIMAGE) {
        this.$message.error('上传文件只能是图片格式!')
      }
      if (!isLt1M) {
        this.$message.error('上传文件大小不能超过 1MB!')
      }
      return isIMAGE && isLt1M
    },
    UploadImage(param){
      const formData = new FormData()
      formData.append('file', param.file)
      UploadImageApi(formData).then(response => {
          console.log('上传图片成功')
        param.onSuccess()  // 上传成功的图片会显示绿色的对勾
        // 但是我们上传成功了图片, fileList 里面的值却没有改变,还好有on-change指令可以使用
      }).catch(response => {
        console.log('图片上传失败')
        param.onError()
      })
    },
    fileChange(file){
      this.$refs.upload.clearFiles() //清除文件对象
      this.logo = file.raw // 取出上传文件的对象,在其它地方也可以使用
      this.fileList = [{name: file.name, url: file.url}] // 重新手动赋值filstList, 免得自定义上传成功了, 而fileList并没有动态改变, 这样每次都是上传一个对象
    },
}

您可能感兴趣的文章:

相关文章