有没有办法用python将数据块写入AWS S3

时间:2019-07-09 23:33:19

标签: python python-3.x amazon-web-services amazon-s3

我正在构建的API当前将文件从端点保存到我的EC2实例。我想将文件直接保存到S3,但无法将数据块流式传输到S3。这是原始代码:

    def _get_file(self, id, values, current, count):
        msg = 'Downloading ID: {} de {}'.format(id, current, count)
        log.info(msg)

        for i in range(TRY_COUNT):
            try:
                r = self._session.get(values['url'], stream=True, timeout=TIMEOUT)
                if r.status_code == 200:
                    with open(values['path_file'], 'wb') as f:
                        for chunk in r.iter_content(1024):
                            f.write(chunk)
                if values['acuse']:
                    self._save_acuse(id, values['acuse'])
                return
            except exceptions.Timeout:
                log.debug('Timeout')
                continue
            except Exception as e:
                log.error(str(e))
                return
        msg = 'Timeout: {}'.format(id)
        log.error(msg)
        return

修改后的程序正在S3存储桶中创建目录和文件,但是实际的txt文件具有0字节,因此它没有将块正确写入S3。

是否甚至可以将块流传输到S3? 还是我必须将文件存储在EC2中,然后将其上传到S3存储桶?

1 个答案:

答案 0 :(得分:0)

我假设您正在使用Boto3与S3进行交互。

在这种情况下,请使用S3客户端的upload_fileobj方法。该方法接受任何类似文件的对象,并将其流式传输到S3中,例如::

import boto3
s3 = boto3.client('s3')

with open('filename', 'rb') as data:
    s3.upload_fileobj(data, 'mybucket', 'mykey')

您可以在本地将文件下载并存储,然后再上传到S3中,或者如果您要用来下载文件的库提供了类似文件的响应对象。

此示例https://gist.github.com/obskyr/b9d4b4223e7eaf4eedcd9defabb34f13requests提供了类似文件的包装,您可以将其直接上载到S3中。