¿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.