我开发了一个Tornado API,它可以获取AWS S3存储桶内容,下面是与Boto完美运行的代码片段。但是,这对于某些不同位置的存储桶不起作用。
该方法返回一个列表(resp),其中包含文件名,大小和文件类型。
想要使用Boto3实现类似。尝试了很多,但Boto3方法返回完整路径的s3桶的所有内容。
def post(self):
try:
resp = []
path = self.get_argument('path')
bucket_name = self.get_argument('bucket_name')
path_len = len(path)
conn = S3Connection()
bucket = conn.get_bucket(bucket_name)
folders = bucket.list(path, "/")
for folder in folders:
if folder.name == path:
continue
if str(folder.name).endswith("/"):
file_type = 'd'
file_name = str(folder.name)[path_len:-1]
else:
_file_size = self.filesize(folder.size)
file_type = 'f'
file_name = str(folder.name)[path_len:]
resp.append({"bucket": bucket_name, "path": path, "name": file_name, "type": file_type,
"size": _file_size if file_type == 'f' else ""})
self.write(json.dumps(resp))
Razvan Tudorica为Boto3的上传和删除方法构建了一个小替代品,该方法使用了Tornado的AsyncHTTPClient;他发表了一篇关于这项工作的博客文章here,并在GitHub上发布了他的代码。
正如最初的SO调查强调所提供的代码片段“不适用于某些不同位置的存储桶”,特别感兴趣的是Razvan的注意事项,“围绕[他]替换的主要想法是使用botocore构建请求(AWS希望使用基于AWS区域和请求数据的不同算法对请求进行签名),并且仅将AsyncHTTPClient用于实际的异步调用。“
我希望Razvan的工作仍然证明对你有用,或者最低限度地对其他人研究类似的努力(就像我最近一样)。