How to send zip files in the python Flask framework?
BytesIO()
needs to be passed bytes data, but a ZipFile()
object is not bytes-data; you actually created a file on your harddisk.
You can create a ZipFile()
in memory by using BytesIO()
as the base:
memory_file = BytesIO()with zipfile.ZipFile(memory_file, 'w') as zf: files = result['files'] for individualFile in files: data = zipfile.ZipInfo(individualFile['fileName']) data.date_time = time.localtime(time.time())[:6] data.compress_type = zipfile.ZIP_DEFLATED zf.writestr(data, individualFile['fileData'])memory_file.seek(0)return send_file(memory_file, attachment_filename='capsule.zip', as_attachment=True)
The with
statement ensures that the ZipFile()
object is properly closed when you are done adding entries, causing it to write the required trailer to the in-memory file object. The memory_file.seek(0)
call is needed to 'rewind' the read-write position of the file object back to the start.