multipart/form-data 的 AWS 上传无效
AWS Upload with multipart/form-data Invalid
我正在将文件发送到 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 url:
....
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;
}
....
这个还需要加签名吗?
我删除了字段对象中不需要的 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;
}
....
我只是浪费了一天的时间试图让 multipart POSTs 到使用 AWS 签名 v4 的 S3。
POST 一直失败,并返回带有 SignatureDoesNotMatch 的 403 Forbidden 响应。我 100% 确定我的签名是正确的,因为我使用 AWS SDK 生成它,而且我知道我的密钥是正确的。
根据文档,我将签名的 POST 字段名称设为 'Signature' 而不是 '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-签名
...
我正在将文件发送到 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 url:
....
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;
}
....
这个还需要加签名吗?
我删除了字段对象中不需要的 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;
}
....
我只是浪费了一天的时间试图让 multipart POSTs 到使用 AWS 签名 v4 的 S3。
POST 一直失败,并返回带有 SignatureDoesNotMatch 的 403 Forbidden 响应。我 100% 确定我的签名是正确的,因为我使用 AWS SDK 生成它,而且我知道我的密钥是正确的。
根据文档,我将签名的 POST 字段名称设为 'Signature' 而不是 '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-签名 ...