Скачивайте файлы в виде потока, не загружая полные файлы в память
Я хочу загружать файлы в виде потока с удаленного сервера и делать из них zip поток и возвращать его во frontend в виде потока без ожидания завершения загрузки всех файлов.
Возможно ли это в python и фреймворке python? Я пробовал как показано ниже, но не работает, я использую фреймворк Django:
zip_buffer = io.BytesIO()
with zipstream.ZipFile(zip_buffer,"w", zipfile.ZIP_DEFLATED, False) as zf:
url = "https://download-file/zy"
r = requests.get(url, stream=True)
zip_inf = zipstream.ZipInfo(file_name)
zf.write_iter(zip_inf, r.content)
response = StreamingHttpResponse(zip_buffer.getvalue(), content_type='application/octet-stream')
response['Content-Disposition'] = 'attachment; filename=zip-files.zip'
return response
Я попробовал использовать aiozipstream и fast api для streamingResponse. это решение сработало для меня.
files = []
urls = ['url1','ur2']
for url in urls:
files.append({'stream': file_content_generator(url), 'name': url.split('/')[-1]})
zf = ZipStream(files, chunksize=32768)
response = StreamingResponse(zf.stream(), media_type='application/zip')
return response
def file_content_generator(url):
with httpx.stream('GET', url, timeout=None) as r:
yield from r.iter_bytes()