繁体   English   中英

带有 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;
    }
....

我只是浪费了一天尝试使用 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-algorithm x-amz-credential policy x-amz-date x-amz-signature ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM