我正在构建的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存储桶?在
我假设您正在使用Boto3与S3交互。在
在这种情况下,使用S3客户机的
upload_fileobj
方法。该方法接受任何类似文件的对象,并将其流式传输到S3中,例如:您可以在本地下载该文件并在上载到S3之前将其存储起来,或者如果用于下载该文件的库提供了类似于文件的响应对象。在
这个例子https://gist.github.com/obskyr/b9d4b4223e7eaf4eedcd9defabb34f13为
requests
提供了一个类似于文件的包装器,您可以使用它直接上传到S3中。在相关问题 更多 >
编程相关推荐