如何上传文件到 S3,并使用 boto3公开?

我可以上传一个图像文件使用:

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

但是,我也希望将该文件公开。我尝试查找一些函数来设置文件的 ACL,但 boto3似乎已经更改了它们的 API 并删除了一些函数。在最新发布的 boto3中有什么方法可以做到这一点吗?

54414 次浏览

我可以使用 objectAcl API 来完成它:

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

若要在一个步骤中将权限上载并设置为公开可读,可以使用:

bucket.upload_file(file, key, ExtraArgs={'ACL':'public-read'})

参见 https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html#the-extraargs-parameter

在 boto 的最新版本中,ACL可以作为一个常规参数使用——似乎在使用 S3客户机和资源时都可以使用。您可以只指定 ACL="public_read",而不必使用 ExtraParamsObjectAclAPI 包装它。

如上所述设置 ACL="public-read"

此外,确保你的桶政策 Resource线 同时具有裸格式和 /*格式。 没有同时拥有这两个权限会导致奇怪的权限问题。

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