带有multipart / form-data的AWS Upload无效

时间:2019-07-12 17:55:06

标签: javascript amazon-web-services http amazon-s3 form-data

我正在将文件发送到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;
    }
....

我还需要为此添加一个签名吗?

2 个答案:

答案 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-签名 ...