最近有个需求,需要在nodejs后端上传图片到云存储服务器,刚好对axios这个库比较熟悉,因此便开始在网上查资料,但是网上大多的都是用axios在前端上传文件的代码,即是基于浏览器环境的。后来找到了基于Nodejs环境的axios上传代码,一番copy后便开始了测试,本以为会一帆风顺,没想到服务器那边却总是返回如下错误,也就是说我们的请求并没有以multipart/form-data的形式封装好。
The body of your POST request is not well-formed multipart/form-data.
后来在Stack Overflow上发现一位老哥也遇到了和我一样的问题,看了网友的回答后才发现原来是没有往header里加content-length,所以服务器解析不了我们的数据。因此我们在封装好form-data后,再获取其长度并添加到header里再去请求就OK啦~
附上完整代码:
const fs = require('fs');
const axios = require('axios');
const FormData =require('form-data');
var localFile = fs.createReadStream('./'+fileKey);
var formData = new FormData();
formData.append('key',fileKey);
formData.append('Signature',data.authorization );
formData.append('file',localFile);
var headers = formData.getHeaders();//获取headers
//获取form-data长度
formData.getLength(async function(err, length){
if (err) {
return ;
}
//设置长度,important!!!
headers['content-length']=length;
await axios.post(data.url,formData,{headers}).then(res=>{
console.log("上传成功",res.data);
}).catch(res=>{
console.log(res.data);
})
})