我正在构建的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存储桶?
答案 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/b9d4b4223e7eaf4eedcd9defabb34f13为requests
提供了类似文件的包装,您可以将其直接上载到S3中。