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

Using boto3, how to put a publicly-readable object into S3 (or DigitalOcean Spaces)

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

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

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

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', } )

谢谢。

感谢@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 )