【问题标题】:AWS S3: MaxPostPreDataLengthExceeded Your POST request fields preceeding the upload file was too largeAWS S3:MaxPostPreDataLengthExceeded 您上传文件之前的 POST 请求字段太大
【发布时间】:2020-03-13 09:26:22
【问题描述】:

我正在尝试使用 AWS Javascript SDK 的 createPresignedPost 方法将文件上传到 AWS S3,
我有以下代码来生成上传的签名凭证 -

let AWS = require('aws-sdk');
let util = require('util');

let s3Client = new AWS.S3({
    region: 'us-east-1'
});

let postSignedUrl = async () => {

    try {
        let postSigningParams = {
            Expires: 60,
            Bucket: "some-bucket-name,
            Conditions: [["content-length-range", 100, 10000000]],
            Fields: {
                key: 'test/image.jpg'
            }
        }

        let s3createPresignedPost = util.promisify(s3Client.createPresignedPost).bind(s3Client);
        let postSignedUrl = await s3createPresignedPost(postSigningParams);

        console.log('postSigningParams => ', postSignedUrl);
    } catch (error) {
        console.error(error);
    }
}

postSignedUrl();

我收到如下凭据 -

{
            "url": "https://s3.amazonaws.com/some-bucket-name",
            "fields": {
                "key": "test/image.jpg",
                "bucket": "some-bucket-name",
                "X-Amz-Algorithm": "AWS4-HMAC-SHA256",
                "X-Amz-Credential": "some/credentials/us-east-1/s3/aws4_request",
                "X-Amz-Date": "20191118T020945Z",
                "X-Amz-Security-Token": "somesecuritytoken",
                "Policy": "somepolicy",
                "X-Amz-Signature": "somesignature"
            }
}

但是当我尝试使用 POSTMAN 工具使用上述凭据上传图片时,
我做不到。

我仔细检查了我的文件大小,它是 5 MB,
而我在创建签名 url 时设置的范围在 100 到 10000000 字节之间

参考资料 -
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#createPresignedPost-property

https://blog.bigbinary.com/2018/09/04/uploading-files-directly-to-s3-using-pre-signed-post-request.html

https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

【问题讨论】:

  • 在我的情况下,关键应该是 AWS S3 的文件夹路径是吗?
  • 是的,对不起。我想我错了。文档对此并不完全清楚
  • 我感觉问题在于您的文件对象的test.jpg POST 字段名称。猜测一下,这已包含在前面的字段中。 This example 使用 file 作为文件的键名。也许试试这个而不是test.jpg
  • @Phil 成功了!使用“文件”作为文件的关键,很棒的人,谢谢!几个小时一直在敲我的头,哈哈
  • 我不怪你,文档可能会好很多。你应该把它写下来作为答案;我相信它会在未来对其他人有所帮助

标签: javascript amazon-web-services amazon-s3 file-upload aws-sdk-js


【解决方案1】:

您没有在表单数据中包含名为 file 的表单字段以及 test.jpg 的内容。

使用 curl 做你想做的事的典型方法是:

curl -X POST -F Content-Type=$content_type -F key=$key \
     -F acl=$acl -F Policy=$policy -F X-Amz-Credential=$credential \
     -F X-Amz-Algorithm=$algorithm -F X-Amz-Storage-Class=$storage_class \
     -F file=@$your_file_name $form_action

在上面的示例代码中,我使用 shell 表示法(即以 $ 为前缀)指定了所有变量(在 POST 之间实际上有所不同 :))。请注意,每当curl 看到以@ 为前缀的字段值时,它会将字段值的其余部分用作文件名,并将文件名的内容用作字段值。

【讨论】:

    猜你喜欢
    • 2020-11-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多