使用boto3,如何将公开可读的对象放入S3(或DigitalOcean Spaces)

时间:2017-12-05 19:24:23

标签: python-2.7 amazon-s3 digital-ocean

有人可以提供以下内容的完整示例:使用boto3和Python(2.7)将文件从台式计算机上传到DigitalOcean Spaces,以便上传的文件可以从Spaces公开读取。

DigitalOcean表示他们的Spaces API与S3 API相同。我不知道这是否100%正确,但这是他们的API:https://developers.digitalocean.com/documentation/spaces

我可以使用下面的代码进行文件上传,但是我找不到如何指定文件可公开读取的示例。我不想让整个Space(= S3 bucket)可读 - 只有对象。

import boto3
boto_session = boto3.session.Session()
boto_client = boto_session.client('s3',
                    region_name='nyc3',
                    endpoint_url='https://nyc3.digitaloceanspaces.com',
                    aws_access_key_id='MY_SECRET_ACCESS_KEY_ID',
                    aws_secret_access_key='MY_SECRET_ACCESS_KEY')
boto_client.upload_file( FILE_PATHNAME, BUCKETNAME, OBJECT_KEYNAME )

将最后一个语句更改为以下语句不起作用:

boto_client.upload_file( FILE_PATHNAME, BUCKETNAME, OBJECT_KEYNAME, 
                         ExtraArgs={ 'x-amz-acl': 'public-read', } )

谢谢。

1 个答案:

答案 0 :(得分:2)

感谢@Vorsprung的上述评论。以下作品:

import boto3
boto_session = boto3.session.Session()
boto_client = boto_session.client('s3',
                    region_name='nyc3',
                    endpoint_url='https://nyc3.digitaloceanspaces.com',
                    aws_access_key_id='MY_SECRET_ACCESS_KEY_ID',
                    aws_secret_access_key='MY_SECRET_ACCESS_KEY')

boto_client.upload_file( FILE_PATHNAME, BUCKETNAME, OBJECT_KEYNAME )
boto_client.put_object_acl( ACL='public-read', Bucket=BUCKETNAME, Key=OBJECT_KEYNAME )