使用 boto3 从 public S3 存储桶下载文件
Download files from public S3 bucket with boto3
我无法下载文件,甚至无法获得 public S3 存储桶的列表 boto3
。
下面的代码适用于我自己的存储桶,但不适用于 public 一个:
def s3_list(bucket, s3path_or_prefix):
bsession = boto3.Session(aws_access_key_id=settings.AWS['ACCESS_KEY'],
aws_secret_access_key=settings.AWS['SECRET_ACCESS_KEY'],
region_name=settings.AWS['REGION_NAME'])
s3 = bsession.resource('s3')
my_bucket = s3.Bucket(bucket)
items = my_bucket.objects.filter(Prefix=s3path_or_prefix)
return [ii.key for ii in items]
我收到此代码的 AccessDenied
错误。该存储桶不在我自己的范围内,我无法在那里设置权限,但我确定它可以 public 读取。
我以前遇到过类似的问题。我在 https://github.com/boto/boto3/issues/134 中找到了这个错误的关键。
您可以使用未记录的技巧:
import botocore
def s3_list(bucket, s3path_or_prefix, public=False):
bsession = boto3.Session(aws_access_key_id=settings.AWS['ACCESS_KEY'],
aws_secret_access_key=settings.AWS['SECRET_ACCESS_KEY'],
region_name=settings.AWS['REGION_NAME'])
client = bsession.client('s3')
if public:
client.meta.events.register('choose-signer.s3.*', botocore.handlers.disable_signing)
result = client.list_objects(Bucket=bucket, Delimiter='/', Prefix=s3path_or_prefix)
return [obj['Prefix'] for obj in result.get('CommonPrefixes')]
我无法下载文件,甚至无法获得 public S3 存储桶的列表 boto3
。
下面的代码适用于我自己的存储桶,但不适用于 public 一个:
def s3_list(bucket, s3path_or_prefix):
bsession = boto3.Session(aws_access_key_id=settings.AWS['ACCESS_KEY'],
aws_secret_access_key=settings.AWS['SECRET_ACCESS_KEY'],
region_name=settings.AWS['REGION_NAME'])
s3 = bsession.resource('s3')
my_bucket = s3.Bucket(bucket)
items = my_bucket.objects.filter(Prefix=s3path_or_prefix)
return [ii.key for ii in items]
我收到此代码的 AccessDenied
错误。该存储桶不在我自己的范围内,我无法在那里设置权限,但我确定它可以 public 读取。
我以前遇到过类似的问题。我在 https://github.com/boto/boto3/issues/134 中找到了这个错误的关键。
您可以使用未记录的技巧:
import botocore
def s3_list(bucket, s3path_or_prefix, public=False):
bsession = boto3.Session(aws_access_key_id=settings.AWS['ACCESS_KEY'],
aws_secret_access_key=settings.AWS['SECRET_ACCESS_KEY'],
region_name=settings.AWS['REGION_NAME'])
client = bsession.client('s3')
if public:
client.meta.events.register('choose-signer.s3.*', botocore.handlers.disable_signing)
result = client.list_objects(Bucket=bucket, Delimiter='/', Prefix=s3path_or_prefix)
return [obj['Prefix'] for obj in result.get('CommonPrefixes')]