如何将文件上传到 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",而不必使用ExtraParamsObjectAcl 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 作业?

使用boto3批量上传图片到S3

如何使用 python 将流上传到 AWS s3

使用 lambda 函数通过 s3 存储桶将巨大的 .csv 文件上传到 dynamodb 时出错

如何同时将视频上传到 s3 为其创建缩略图并使用 nodejs 将其保存到同一存储桶中的另一个文件夹中?

将 Dataframe 保存到 csv 直接保存到 s3 Python