python http flask zipfile

¿Cómo enviar archivos zip en el marco de Python Flask?



http zipfile (1)

Tengo un servidor de matraz que toma datos binarios para varios archivos diferentes de una base de datos y los coloca en un objeto ''zipfile'' de Python. Quiero enviar el archivo zip generado con mi código usando el método "send_file" del matraz.

Originalmente pude enviar archivos no zip con éxito usando BytesIO (bin) como primer argumento para enviar_archivo, pero por alguna razón no puedo hacer lo mismo con mi archivo zip generado. Da el error:

''ZipFile'' no tiene la interfaz del búfer.

¿Cómo envío este objeto de archivo zip al usuario con Flask?

Este es mi código:

@app.route("/getcaps",methods=[''GET'',''POST'']) def downloadFiles(): if request.method == ''POST'': mongo = MongoDAO(''localhost'',27017) identifier = request.form[''CapsuleName''] password = request.form[''CapsulePassword''] result = mongo.getCapsuleByIdentifier(identifier,password) zf = zipfile.ZipFile(''capsule.zip'',''w'') 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'']) return send_file(BytesIO(zf), attachment_filename=''capsule.zip'', as_attachment=True) return render_template(''download.html'')


BytesIO() necesita pasar datos de bytes , pero un objeto ZipFile() no es bytes de datos; en realidad creó un archivo en su disco duro .

Puede crear un ZipFile() en la memoria utilizando BytesIO() como 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)

La instrucción with asegura que el objeto ZipFile() se cierra correctamente cuando ZipFile() agregar entradas, lo que hace que escriba el avance requerido en el objeto del archivo en memoria. La memory_file.seek(0) es necesaria para ''rebobinar'' la posición de lectura y escritura del objeto de archivo de nuevo al inicio.