我可以使用以下代码上传图片文件:
s3 = session.resource('s3')
bucket = s3.Bucket(S3_BUCKET)
bucket.upload_file(file, key)
然而,我也希望将该文件公开。我试图查找一些设置文件ACL的函数,但似乎boto3已更改其API并删除了一些函数。在最新版本的boto3中是否有方法可以实现这一点?
为了在一步上传并设置公共可读权限,您可以使用以下代码:
bucket.upload_file(file, key, ExtraArgs={'ACL':'public-read'})
s3 = boto3.resource('s3')
object_acl = s3.ObjectAcl('bucket_name','object_key')
response = object_acl.put(ACL='public-read')
详细信息请参考:http://boto3.readthedocs.io/en/latest/reference/services/s3.html#objectacl
boto3.resource('s3').ObjectAcl('bucket_name', 'object_key').put(ACL='public-read')
。
这将使特定S3存储桶中的特定对象公开可读。 - openwonkACL = 'public-read'
一样有效:GrantRead = 'uri="http://acs.amazonaws.com/groups/global/AllUsers"'
- Dave LandAdi的方法可行。然而,如果你像我一样,可能会遇到访问被拒绝的问题。这通常是由于用户权限被破坏所引起的。
我通过将以下内容添加到 Action
数组中来修复它:
Action
数组中来解决它:"s3:GetObjectAcl",
"s3:PutObjectAcl"
ACL
作为常规参数可用 - 无论是使用 S3 客户端还是资源时都是如此。您只需指定 ACL="public_read"
,而无需将其包装在 ExtraParams
中或使用 ObjectAcl
API。public-read
而不是 public_read
。 - contrariwise按照上述所述,设置ACL="public-read"
。
此外,请确保您的存储桶策略Resource
行具有裸arn和/*
arn格式。如果两者都没有,则可能会导致奇怪的权限问题。
...
"Resource": ["arn:aws:s3:::my_bucket/*", "arn:aws:s3:::my_bucket"]
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 LandObject(bucket, key).upload_file(path, ExtraArgs={'ACL':'public-read'})
- sebaslh12