0

我开发了一个 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))
4

1 回答 1

0

Razvan Tudorica 为使用 Tornado 的 AsyncHTTPClient 的 Boto3 的上传和删除方法构建了一个小替代品;他在这里发表了一篇关于这项工作的博文,并在GitHub 上发布了他的代码。

正如最初的 SO 查询强调提供的代码片段“不适用于某些不同位置的存储桶”,这里特别感兴趣的是 Razvan 的注释,“围绕 [他的] 替换的主要思想是使用 botocore 构建请求(AWS 希望使用基于 AWS 区域和请求数据的不同算法对请求进行签名)并且仅将 AsyncHTTPClient 用于实际的异步调用。”

我希望 Razvan 的工作仍然对您有用,或者至少对其他研究类似工作的人有用(就像我最近一样)。

于 2019-02-18T18:09:08.537 回答