我正在将文件发送到presignedPOST URL以上传到AWS S3,并在我发现的其他资源中,使用form-data
发送文件就是切换到multipart/form-data
来发送文件。
这是我创建的表单数据:
fields['file'] = new File([this.get_compressed_photo],manifest.photo, {type: "image/jpeg"});
var form = new FormData();
for(let field in fields){
form.append(field+"", fields[field]);
}
try {
response = await axios.post(my_url, form, {
headers : {
"Content-Type" : "multipart/form-data",
}
});
}catch(error){
console.log(error);
}
这是请求中PARAM形式的字段:
Content-Disposition: form-data; name="file"; filename="file_name.jpg"
Content-Type: image/jpeg
function() {
[native code]
}
这里出问题了吗?
更新: AWS确实会响应,但不会出现与该文件相关的错误。我不确定这是否意味着该文件仍然有效,但是仅查看图像文件的值,就不知道如何。
<Error><Code>SignatureDoesNotMatch</Code>....
我正在使用aws-sdk
并创建presignedPOST网址,如下所示:
....
let path = process.env.PATH + identifier + "/" + file_name;
var url = false;
try{
const url = await s3.createPresignedPost({
Bucket: process.env.BUCKET,
Expires: (60 * 5),
Fields : {
key: path,
AWSAccessKeyId: process.env.KEY,
},
});
return url;
}catch(error){
return false;
}
....
我还需要为此添加一个签名吗?
答案 0 :(得分:0)
我在字段对象中删除了不需要的AWSAccessKeyId
。在某个地方的示例中,我看到它已添加,因此我最初添加了它。
删除它会使它像灵符一样工作,我认为它弄乱了AWS特定的字段必填顺序。
....
let path = process.env.PATH + identifier + "/" + file_name;
var url = false;
try{
const url = await s3.createPresignedPost({
Bucket: process.env.BUCKET,
Expires: (60 * 5),
Fields : {
key: path, // key is the only required field here
//AWSAccessKeyId: process.env.KEY, << I COMMENTED OUT THIS LINE
},
});
return url;
}catch(error){
return false;
}
....
答案 1 :(得分:0)
我只是浪费了一天时间尝试使用 AWS 签名 v4 将多部分 POST 发送到 S3。
POST 一直失败,并返回带有 SignatureDoesNotMatch 的 403 Forbidden 响应。我 100% 确定我的签名是正确的,因为我使用 AWS 开发工具包生成它,并且我知道我的密钥是正确的。
根据文档,我将签名的 POST 字段名称设为“签名”而不是“x-amz-signature”,因为将其更改为“x-amz-signature”只会导致 400 响应而不是403,错误消息说我缺少签名字段!
然后我意识到 S3 正在尝试验证我的请求,就好像它是使用 AWS 签名版本 2 签名的一样!修复方法是根据文档使用“x-amz-signature”,但还要确保多部分 POST 数据中的“x-amz-algorithm”字段位于所有其他字段之前! AWS 文档没有这样显示。显然,S3 要求此字段排在第一位,以便它知道要使用什么算法。
我最终得到了以下现在有效的顺序: x-amz-算法 x-amz-凭证 政策 x-amz-日期 x-amz-签名 ...