【问题标题】:AWS S3 generate_presigned_url vs generate_presigned_post for uploading filesAWS S3 generate_presigned_url vs generate_presigned_post 用于上传文件
【发布时间】:2021-03-19 18:38:19
【问题描述】:

我正在使用预签名的 URL 将文件上传和下载到 S3 存储桶。我遇到了generate_presigned_url('put_object')generate_presigned_post 这两种方法。

这两种方法有什么区别?

# upload a file to a bucket with generate_presigned_url with put object
s3_client.generate_presigned_url('put_object', Params= {'Bucket': "BUCKET_NAME",
                                                        "Key":"OBJECT_KEY"},
                                                         ExpiresIn=3600)
  

# upload a file to a bucket using presigned post
s3_client.generate_presigned_post(Bucket="BUCKET_NAME", Key="OBJECT_PATH",
                                  ExpiresIn=3600)

谁能解释一下两者的区别?

如果我们有generate_presigned_post,为什么首先有一个带有put_objectgenerate_presigned_url 方法用于上传。

注意:我知道generate_presigned_post 是推荐的文件上传方法,我也使用过相同的方法。但是,没有明确的文档说明这些方法之间的区别。

【问题讨论】:

  • 这里是 POST 的docgenerate_presigned_url 是一种不限于生成 PUT url 的通用方法。例如,您还可以使用它来临时授予某人对私有存储桶中 GetObject 的权限。
  • 谢谢.. 我明白 generate_presigned_url 是通用的,适用于上传和下载。但我只是好奇它们之间是否有特定的区别。为什么我们已经有方法时还需要发布

标签: python-3.x amazon-web-services amazon-s3 boto3 pre-signed-url


【解决方案1】:

这是@jellycsc 评论的扩展版本。我也向 aws 支持发布了相同的查询。我从他们那里得到了以下答案。

更详细的解释给here

在这里发布,因为它可能对某人有用。

这两种方法有什么区别?

generate_presigned_post() 更强大,因为 POST Policy 功能。 POST 策略只是您在创建预签名 POST 时设置的条件。使用它,您可以允许某些 MIME 类型和文件扩展名,允许使用给定前缀上传多个文件,限制文件大小等等,这在 generate_presigned_url() 中是不可能的

请注意,这两种方法都可以用于实现相同的目标,即为用户提供可控的方式将文件直接上传到 S3 存储桶。两者的过程也是相同的,因为后端需要在验证用户被授权后对请求进行签名,然后浏览器将文件直接发送到 S3。

区别:

URL结构:

PUT URL 对 URL 本身中的所有内容进行编码,因为没有其他任何内容传回给客户端。这意味着可以自定义的变量更少。

POST URL 使用多个字段来存储不同类型的信息。签名算法会返回一个字段列表以及 URL 本身,并且客户端在访问预签名 URL 时也必须将这些字段发送到 S3。

虽然 PUT URL 提供了上传文件的目的地,而无需任何其他必需部分,但 POST URL 是为可以发送多个字段的表单创建的。但是,它们的使用不限于表单。

内容类型

对于 PUT URL,必须针对特定内容类型进行签名。这意味着您可以在后端硬编码内容类型,例如,如果您希望允许用户上传 XML 文档,则为 application/xml,或者客户端必须发送所需的内容类型作为签名请求的一部分。

对于 POST URL,该策略支持前缀约束以及完全匹配。

内容长度:

对于 PUT URL,您无法控制上传文件的大小。

对于 POST URL,您可以在策略中设置允许的范围。

python 中的预签名帖子示例:

response = s3_client.generate_presigned_post(Bucket="BUCKET_NAME",
                                                     Key="S3KEY",
                                                     Fields={"Content-Type": "image/jpg"},
                                                     Conditions=["starts-with", "$Content-Type", "image/"],
                                                     ExpiresIn=3600)

【讨论】:

    猜你喜欢
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2021-10-24
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多