axios上传文件

一般来说需要转FormData格式

let fileData = file.file;	// 拿到file后,转为FormData格式,这样再发送给后端就可以了
let formData = new FormData();
formData.append("token", that.token);
formData.append("img", fileData);
  api_setUploader(formData)	// 发起请求(此处的axios做了封装)
  .then((res)=>{
    console.log(res)
  })
  .catch((err)=>{
    console.log(err)
  })
  

如果还是不行,请查看是否是以下问题,我的后端所有的数据格式都是FormData,所以对axios添加了请求拦截,中途用qs转一下,但是这样对文件流就造成了二次转换,所以还是发不过去,如果文件流在发起请求之前不转FormData,那连axios都进不去,所以不得已,我加了一个判断,查看打印js原型是否为空,如果为空:则说明是文件流,不去要再次转换,如果不为空:则说明是普通数据,需要转换,这样就可以了。

注:个人感觉这么做存在一定的风险,但是目前能力有限,如果有不正确的欢迎指正

补充:payLoad数组中传递的是字符串,FoemData传递的是键值对,file文件流传入axios中实际上是没有东西的,所有的都挂载原型链上,所以打印原型结果是数组为空

export const Service = axios.create({
  timeout: 7000, // 请求超时时间
  baseURL: ConfigBaseURL,
  method: 'post',
  headers: {
    'content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
  }
  
})
// 添加请求拦截器
Service.interceptors.request.use(config => {
  // console.log(config)
  // console.log(config.data)
  console.log(Object.getOwnPropertyNames(config.data))
  if(Object.getOwnPropertyNames(config.data)==''){
    return config
  }else{
    config.data = qs.stringify(config.data);
    return config
  }
 
})

附上 上传图片是的打印截图:
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐