大家好,又见面了,我是你们的朋友全栈君。
最近有个需求,需要在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);
})
})
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149289.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...