如何将文件上传到 S3 并使用 boto3 将其公开?
Posted
技术标签:
【中文标题】如何将文件上传到 S3 并使用 boto3 将其公开?【英文标题】:How to upload a file to S3 and make it public using boto3? 【发布时间】:2017-06-13 18:35:18 【问题描述】:我可以使用以下方法上传图像文件:
s3 = session.resource('s3')
bucket = s3.Bucket(S3_BUCKET)
bucket.upload_file(file, key)
但是,我也想公开文件。我尝试查找一些函数来为文件设置 ACL,但似乎 boto3 更改了它们的 API 并删除了一些函数。有没有办法在最新版本的 boto3 中做到这一点?
【问题讨论】:
【参考方案1】:在最近的 boto 版本中,ACL
可作为常规参数使用 - 似乎在使用 S3 客户端和资源时都是如此。您可以只指定ACL="public_read"
,而不必使用ExtraParams
或ObjectAcl
API 包装它。
【讨论】:
必须是public-read
而不是public_read
【参考方案2】:
要一步上传并设置公开可读的权限,您可以使用:
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
【讨论】:
无论如何都不适用于 boto3:botocore.exceptions.ParamValidationError: Parameter validation failed: Unknown parameter in input: "ExtraArgs", must be one of: 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
使用 boto3 为我工作【参考方案3】:
Adi's way 有效。但是,如果您像我一样,您可能会遇到访问被拒绝的问题。这通常是由用户的权限损坏引起的。
我通过将以下内容添加到 Action
数组来修复它:
"s3:GetObjectAcl",
"s3:PutObjectAcl"
【讨论】:
在哪里声明 Action 数组?【参考方案4】:我可以使用 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
【讨论】:
如果你只更新一个对象boto3.resource('s3').ObjectAcl('bucket_name','object_key').put(ACL='public-read')
这和ACL = 'public-read'
: GrantRead = 'uri="http://acs.amazonaws.com/groups/global/AllUsers"'
一样有效
对于任何将来阅读本文的人来说,显然公开阅读是目前的默认。请参阅django-storages.readthedocs.io/en/latest/backends/…中的巨大警告以上是关于如何将文件上传到 S3 并使用 boto3 将其公开?的主要内容,如果未能解决你的问题,请参考以下文章
您如何使用 boto3(或其他方式)在 emr 上自动化 pyspark 作业?
使用 lambda 函数通过 s3 存储桶将巨大的 .csv 文件上传到 dynamodb 时出错