Element图片上传el-upload组件使用FormData自定义上传

1、HTML

<template>
  <div>
    <el-upload
      :disabled="saveLoading"
      action="upload"
      :show-file-list="false"
      :http-request="selfUpload"
      :before-upload="beforeAvatarUpload"
      accept=".wav"
    >
      <el-button
        :disabled="saveLoading"
        :loading="saveLoading"
        type="primary"
      >上传文件</el-button>
    </el-upload>
  </div>
</template>

2、JS

<script>
import {
  uploadFile
} from '@/api/upload'

export default {
  // 属性
  props: {
    configId: {
      type: Number,
      default: null
    }
  },
  // 数据
  data() {
    return {
      saveLoading: false // 保存按钮loading效果
    }
  },
  // 方法
  methods: {
    // 上传语音文件并保存
    uploadFile(params) {
      this.saveLoading = true
      uploadFile(params)
        .then(res => {
          if (res.data.result.code === '200') {
            this.$message.success(res.data.result.message)
            this.$emit('update')
          } else {
            this.$message.error(res.data.result.message)
          }
          this.saveLoading = false
        })
        .catch(err => {
          this.saveLoading = false
          console.log('报错', err)
        })
    },
    /** **************************图片上传---start---*********************************************** */
    // 自定义上传行为,使用接口上传
    selfUpload(param) {
      console.log('imgcontent', param)
      console.log('file', param.file)
      const formData = new FormData()
      formData.append('file', param.file)
      formData.append('neighNo', localStorage.getItem('neighNo'))
      formData.append('configId', this.configId)
      this.uploadFile(formData)
    },

    beforeAvatarUpload(file) {
      console.log('file', file)
      const isMP4 = file.type === 'audio/wav'
      const isLt10M = file.size / 1024 / 1024 < 1
      if (!isMP4) {
        this.$message.error('上传视频只支持WAV,请确认后重新上传')
      }
      if (!isLt10M) {
        this.$message.error('视频大于1M,请确认后重新上传')
      }
      return isMP4 && isLt10M
    }
    /** **************************图片上传---end---*********************************************** */
  }
}
</script>

3、Request接口请求使用默认的FormData

// 请求拦截器
  service.interceptors.request.use(
    config => {
      const header = {
        appName: 'app',
        dateTime: new Date().getTime(),
        user: 'admin',
        language: 'ZH_CN',
        serviceName: 'getInfo',
        versionId: 'v0.1.1',
        token: store.getters.token,
        refreshToken: '111b5988d40a3a9698661ad5e3df11fb'
      }
      const cData = config.data
      const isObj = Object.prototype.toString.call(cData) === '[object Object]'
      const isFormData = Object.prototype.toString.call(cData) === '[object FormData]'
      const isArr = Object.prototype.toString.call(cData) === '[object Array]'
      if (isObj && !isArr) {
        config.data = {
          header: header,
          body: {
            ...cData
          }
        }
      } else if (isFormData) {
        // 不用操作,FormData原封不动的数据
      } else {
        config.data = {
          header: header,
          body: cData
        }
      }
      // 全局等待加载
      // Do something before request is sent
      if (store.getters.token) {
        // 让每个请求携带token-- ['Authorization']为自定义key 请根据实际情况自行修改
        config.headers['Authorization'] = 'Bearer ' + store.getters.token // Bearer是后端要求带的
        // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
        // config.headers['X-Token'] = getToken()
      }
      return config
    },
    error => {
      // Do something with request error
      console.log('请求拦截request.js报错', error) // for debug
      Promise.reject(error)
    }
  )
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容