我正在使用预签名 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
为什么首先要有一个带有 generate_presigned_url
的 put_object
方法来上传。
注意:我知道
generate_presigned_post
是推荐的文件上传方法,我也使用过同样的方法。但是,没有明确的文档说明这些方法之间的区别。
这是@jellycsc 评论的扩展版本。我也向 aws 支持发布了相同的查询。我从他们那里得到了以下答案。
更详细的解释请参见这里
在这里发帖,因为它可能对某人有用。
这两种方法有什么区别?
由于 POSTPolicy
功能,
generate_presigned_post()
更加强大。 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)