JavaScript 使用预签名 URL 保存到 S3

Posted

技术标签:

【中文标题】JavaScript 使用预签名 URL 保存到 S3【英文标题】:JavaScript Using Pre-Signed Url to Save to S3 【发布时间】:2018-08-02 23:24:43 【问题描述】:

我正在使用 aws-sdk 获取 S3 的预签名 URL。我将函数包装在 lambda 中。

const aws = require('aws-sdk');

module.exports = CreateRecord => 
  CreateRecord.controllers.createSignature = (event, context, callback) => 
    const s3 = new aws.S3(
      signatureVersion: 'v4',
    );

    const params = 
      Bucket: 'random-test-bucket002',
      Key: 'test-key',
      Expires: 100
    ;

    s3.getSignedUrl('putObject', params, function(err, signedUrl) 
      let response;
      if (err) 
        response = 
          statusCode: 500,
          headers: 
            'Access-Control-Allow-Origin': '*',
          ,
          body: JSON.stringify(
            error: 'Did not receive signed url'
          ),
        ;
       else 
        response = 
          statusCode: 200,
          headers: 
            'Access-Control-Allow-Origin': '*', // Required for CORS support to work
          ,
          body: JSON.stringify(
            message: `Url successfully created`,
            signedUrl,
          )
        ;
      
      callback(null, response);
    );
  ;
;

这段代码工作得很好,我找回了我的预签名网址。当我在前端运行此代码时:

postImage(uuid) 
    const getSignature = 'https://xyz.execute-api.us-east-1.amazonaws.com/dev/v1/createSignature';
    axios.get(getSignature)
    .then(res => 
        const signatureUrl = res.data.signedUrl;
        // I have a blob that I store in file
        // uuid is passed from another function
        const file = new File([this.state.cover], uuid);

        axios.post(signatureUrl, file)
        .then(s3Res => 
            console.log(s3Res);
        );
    );

我不断收到的错误是:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。我尝试弄乱一些内容类型的标头,但没有任何效果。我可以将预签名的 url 传递给 aws-sdk 中的函数吗?我已经查看了很多关于此的帖子,但似乎无法解决问题。

【问题讨论】:

尝试 axios.put(...) 以使用 HTTP PUT 而不是 POST。 哇...这工作。疯狂的。太感谢了!!!似乎我所寻找的所有地方都在使用 POST 【参考方案1】:

当使用预签名的 PutObject URL 上传到 S3 时,您应该使用 HTTP PUT 方法而不是 HTTP POST 方法上传文件。您可以将对象 POST 到 S3,但这是为基于浏览器的上传而设计的。

【讨论】:

以上是关于JavaScript 使用预签名 URL 保存到 S3的主要内容,如果未能解决你的问题,请参考以下文章

使用预签名 URL 将文件上传到 Amazon S3 时出现 CORS 错误

如何将文件上传到 AWS 中的预签名 URL?

使用预签名 URL 上传到 S3 存储桶会出现 403 禁止错误

使用预签名的 url PUT 到 S3 会出现 403 错误

使用 Cloudfront/CDN 预签名的 S3 URL

使用 AlamoFire 和预签名 URL 将图像上传到 S3 存储桶时出现问题