有没有办法用python编写块到aws3

2024-06-25 22:56:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建的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 bucket中创建目录和文件,但是实际的txt文件有0字节,因此它不能正确地将块写入S3。在

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


Tags: 文件selflogidgetreturns3timeout
1条回答
网友
1楼 · 发布于 2024-06-25 22:56:21

我假设您正在使用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中。在

相关问题 更多 >