Reputation: 1321
I have a folder structure on my web server that I would like to serve as a zipped archive through Flask.
Serving a file through Flask is pretty straight forward through Flasks send_file:
return send_file(my_file,
attachment_filename=fileName,
as_attachment=True)
Zipping can get accomplished in various ways like with shutil.make_archive
or zipfile
, but i cannot figure out how to zip the whole directory in memory and then send it without saving anything to disk. shutil.make_archive
seem to only be able to create archives on disk. The examples on zipfile
found on the Internet are mainly about serving single files.
How would I tie this together in a single method without having to save everything to disk? Preferably using BytesIO
.
Upvotes: 4
Views: 2596
Reputation: 1321
import time
from io import BytesIO
import zipfile
import os
from flask import send_file
@app.route('/zipped_data')
def zipped_data():
timestr = time.strftime("%Y%m%d-%H%M%S")
fileName = "my_data_dump_{}.zip".format(timestr)
memory_file = BytesIO()
file_path = '/home/data/'
with zipfile.ZipFile(memory_file, 'w', zipfile.ZIP_DEFLATED) as zipf:
for root, dirs, files in os.walk(file_path):
for file in files:
zipf.write(os.path.join(root, file))
memory_file.seek(0)
return send_file(memory_file,
attachment_filename=fileName,
as_attachment=True)
Upvotes: 10