如何使用boto3将文件上传至S3并使其公开?

90

我可以使用以下代码上传图片文件:

s3 = session.resource('s3')
bucket = s3.Bucket(S3_BUCKET)
bucket.upload_file(file, key)

然而,我也希望将该文件公开。我试图查找一些设置文件ACL的函数,但似乎boto3已更改其API并删除了一些函数。在最新版本的boto3中是否有方法可以实现这一点?

5个回答

144

4
无论如何都无法使用boto3,因为出现了以下错误:botocore.exceptions.ParamValidationError: 参数验证失败:输入中存在未知参数“ExtraArgs”,必须是以下参数之一:ACL、Body、Bucket、CacheControl、ContentDisposition、ContentEncoding、ContentLanguage、ContentLength、ContentMD5、ContentType、Expires、GrantFullControl、GrantRead、GrantReadACP、GrantWriteACP、Key、Metadata、ServerSideEncryption、StorageClass、WebsiteRedirectLocation、SSECustomerAlgorithm、SSECustomerKey、SSECustomerKeyMD5、SSEKMSKeyId、RequestPayer、Tagging、ObjectLockMode、ObjectLockRetainUntilDate、ObjectLockLegalHoldStatus - Dave Land
2
使用boto3对我有效。 - yardstick17
1
使用boto3和Object。Object(bucket, key).upload_file(path, ExtraArgs={'ACL':'public-read'}) - sebaslh12
https://dev59.com/BKDia4cB1Zd3GeqPCFYz#43023965 - Jossef Harush Kadouri

55

10
如果您只更新一个对象,可以使用以下一行代码: boto3.resource('s3').ObjectAcl('bucket_name', 'object_key').put(ACL='public-read')。 这将使特定S3存储桶中的特定对象公开可读。 - openwonk
这个和 ACL = 'public-read' 一样有效:GrantRead = 'uri="http://acs.amazonaws.com/groups/global/AllUsers"' - Dave Land
对于未来阅读此内容的任何人,显然public-read是默认的。请参见https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html中的巨大警告。 - Oded

13

Adi的方法可行。然而,如果你像我一样,可能会遇到访问被拒绝的问题。这通常是由于用户权限被破坏所引起的。 我通过将以下内容添加到 Action 数组中来修复它:


我通过将以下内容添加到 Action 数组中来解决它:

"s3:GetObjectAcl",
"s3:PutObjectAcl"

8
您在哪里声明Action数组? - fnaquira
@Rohan,你能详细解释一下这个“Action”数组是什么吗? - Rylan Schaeffer
1
很久以前写的,错过了评论。 对于造成的混淆感到抱歉。请查看:https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_action.html - Rohan Bagchi

0
在最近的 boto 版本中,ACL 作为常规参数可用 - 无论是使用 S3 客户端还是资源时都是如此。您只需指定 ACL="public_read",而无需将其包装在 ExtraParams 中或使用 ObjectAcl API。

它必须是 public-read 而不是 public_read - contrariwise

0

按照上述所述,设置ACL="public-read"

此外,请确保您的存储桶策略Resource行具有裸arn和/* arn格式。如果两者都没有,则可能会导致奇怪的权限问题。

...
"Resource": ["arn:aws:s3:::my_bucket/*", "arn:aws:s3:::my_bucket"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接