我试图通过NodeJS服务器(而不是浏览器)的签名URL将图像上传到aws-s3。要上传的图像已由NodeJS生成。我从aws得到签名网址,并成功上传到s3。
但我的形象已经败坏了。出于某种原因,S3正在添加一些标题到我的图像(比较图像附件)。
我做错了什么?
获取签名的URL:
try {
var params = {
Bucket: bucketName,
Key: 'FILE_NAME.png',
Expires: 60
};
const url = await s3.getSignedUrlPromise('putObject', params);
return url;
} catch (err) {
throw err;
}
上传到s3
var stats = fs.statSync(filePath);
var fileSizeInBytes = stats["size"];
const imageBuffer = fs.readFileSync(filePath);
var formData = {
'file': {
value: imageBuffer,
options: {
filename: 'FILE_NAME.png'
}
}
};
request({
method: 'put',
url,
headers: {
'Content-Length': fileSizeInBytes,
'Content-MD': md5(imageBuffer)
},
formData
}, function (err, res, body) {
console.log('body',body);
});
比较实际图像和上传到s3的图像。S3添加了一些标题:
4条答案
按热度按时间zysjyyx41#
我知道这是旧的,但我挣扎了一段时间同样的问题。使用预签名的URL上传时,不要使用new FormData();
有一件事我注意到,我在s3上的所有文件都比原始文件大2kb。
sbdsn5lh2#
来到这里在2023年,面临着同样的问题使用formdata,但在 Postman ,在把它交给前端部门。
要在postman中处理它,请使用请求体的类型
binary
:不要忘记添加适当的标题。
gr8qqesn3#
我遵循了上面的react js解决方案
在上传图像之前,我所做的是通过HTTP对象URL,然后将其传递给API主体。
正确方法:
为我工作,谢谢山姆门罗
qgzx9mmu4#
尝试将请求中的内容类型指定为
Content-Type
multipart/form-data
。