vue+element+aixos上传文件formData形式传参

element的上传文件组件可在action里直接写上传文件的接口,但一般vue+element项目都是封装了axios请求的,所以都会选择适用http-request做自定义上传,我在做这个的过程中遇到的问题:
我的代码是这样子滴:

<el-upload
    class="upload-demo"
    action="none"
    :on-remove="handleRemove"
    :before-remove="beforeRemove"
    :http-request="uploadFile"
    :limit="1"
    :on-exceed="handleExceed">
    <el-button size="small" type="primary">点击上传</el-button>
    <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
  </el-upload>

方法代码:

uploadFile(param){
      var $this = this;
      console.log(param);
      var formData = new FormData();
      formData.append('file',param.file);
      $this.$store.dispatch('api/fileUploadAction', formData).then(response=>{
        if(response){
          if(response.status){
          }else{
            $this.$message({
              showClose: true,
              message: response.info,
              type: 'error'
            });
          }
        }
      });
 },

这里我想打印一下formData,看一下这是个什么玩意,发现直接console.log是个空!,然后百度!发现这玩意是不能直接console.log的,想看看是什么玩意,需要像这样:

formData.forEach(funciton(key,value){
	console.log(value);
});

上面可以看到我的请求接口都是通过vuex状态管理的,具体如下:

/** store/modules/api.js **/
import { fileUpload } from '@/api/api'
const actions = {
	// 文件上传
    fileUploadAction({ commit, state },data) {
      return new Promise((resolve, reject) => {
        fileUpload(data).then(response => {
          resolve(response)
        }).catch(error => {
          reject(error)
        })
      })
    },
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}

/** api/api.js 接口文件 **/
import request from "@/utils/request";
// 文件上传
export function fileUpload(data) {
    return request({
      url: "程序接口链接",
      method: "POST",
      data,
      headers:{
        isFile:true,
      }
    });
}

这里是我做了一些处理的地方,我在接口方法中传了headers,新增了一个自定义字段isFile,这个字段主要是为了在封装的请求中使用,因为封装的请求都有拦截器,拦截器里对数据都使用qs.stringify进行了转化,但是!!! formData的数据是不能转化的,所以这里使用从headers里传的这个字段来判断,当前请求是不是文件上传请求,是的话,就不做操作,直接把参数传给后端,就行了,具体拦截器部分代码如下:

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  withCredentials: true, // send cookies when cross-domain requests
  crossDomain:true,
  timeout: 50000, // request timeout
  url:""
})
// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent
    config.transformRequest=[function(data){
        let newData = data;
        if(!config.headers.isFile){
          for (let i in data) {
            if (Array.isArray(data[i])) {
              if (data[i].length === 0) {
                data[i] = null
              }
            }
          }
          newData = Qs.stringify(data);
        }
        return newData;
    }];
    console.log(config,"请求数据");
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

网上也有一些其他的方法去实现,但个人感觉这种可能跟好理解一些,好啦,这样就可以愉快的上传文件啦~!!!

上一篇:formDate序列化


下一篇:【leetcode】859. 亲密字符串