【问题标题】:How to use an S3 pre-signed POST url?如何使用 S3 预签名的 POST url?
【发布时间】:2021-10-13 09:13:41
【问题描述】:

其实这是我第一次使用 s3 上传文件。我听说过预签名的 url 但显然,我无法设置文件大小的限制,所以我找到了“预签名的 post url”,但这有点奇怪!令人惊讶的是我没有找到任何示例。也许这不是我想要的。

我正在从服务器获取预签名的帖子网址:

const { S3 } = require("aws-sdk");

const s3 = new S3({
  accessKeyId: accessKey,
  secretAccessKey: secretKey,
  endpoint: api,
  s3ForcePathStyle: true,
  signatureVersion: "v4",
});

app.post("/get-url", (req, res) => {
  const key = `user/${uuri.v4()}.png`;
  const params = {
    Bucket: "bucketName",
    Fields: {
      Key: key,
      ContentType: "image/png",
    },
  };

  s3.createPresignedPost(params, function (err, data) {
    if (err) {
      console.error("Presigning post data encountered an error", err);
    } else {
      res.json({ url: data.url });
    }
  });
});

奇怪的是,我得到的 url 不像预签名的 url。它只是端点后跟存储桶名称。没有查询参数。没办法。

你可能猜到了,我不能使用这个网址:

await axios.put(url, file, {
  headers: {
    "Content-Type": "image/png",
  },
});

我什至不知道我应该使用 post 还是两个 requests。

我都试过了,没有任何反应。也许预签名的 post url 不像预签名的 url!

至少给我一个例子!我找不到。

【问题讨论】:

    标签: javascript amazon-web-services express amazon-s3 pre-signed-url


    【解决方案1】:

    您在正确的轨道上,但您需要更改您正在调用的方法。您当前使用的 createPresignedPost() 的 AWS S3 API 文档指出:

    获取预签名的 POST 策略以支持直接从 HTML 表单上传到 S3。

    尝试将此方法更改为getSignedUrl()

    获取给定操作名称的预签名 URL。

    const params = { Bucket: 'bucket', Key: 'key' };
    s3.getSignedUrl('putObject', params, function (err, url) {
      if (err) {
        console.error("Presigning post data encountered an error", err);
      } else {
        res.json({ url });
      }
    });
    

    或同步:

    const params = { Bucket: 'bucket', Key: 'key' };
    const url = s3.getSignedUrl('putObject', params)
    res.json({ url });
      
    

    或者,通过执行 getSignedUrlPromise() 来使用 Promise:

    返回一个“thenable”承诺,该承诺将使用给定操作名称的预签名 URL 进行解析。

    const params = { Bucket: 'bucket', Key: 'key' };
    s3.getSignedUrlPromise('putObject', params)
      .then(url => {
         res.json({ url });
      }, err => { 
         console.error("Presigning post data encountered an error", err);
      });
    

    还请阅读 API 文档的注释部分,以确保您了解每种方法的限制。

    【讨论】:

      猜你喜欢
      • 2018-12-25
      • 2017-07-21
      • 2017-02-26
      • 2018-12-27
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      相关资源
      最近更新 更多