2014-12-06 11 views
13

Ich habe einen Flaschen-Server, der Binärdaten für mehrere verschiedene Dateien aus einer Datenbank ergreift und sie in ein Python-Objekt 'zipfile' legt. Ich möchte die generierte ZIP-Datei mit meinem Code senden, indem ich die Methode "send_file" von flask verwende.Wie Zip-Dateien im Python-Flask-Framework senden?

Ich konnte ursprünglich non-zip-Dateien erfolgreich senden, indem ich das BytesIO (bin) als erstes Argument für send_file verwendete, aber aus irgendeinem Grund kann ich das nicht mit meiner generierten Zip-Datei machen. Es gibt den Fehler:

'ZipFile' verfügt nicht über die Pufferschnittstelle.

Wie sende ich dieses Zip-Dateiobjekt an den Benutzer mit Flask?

Dies ist mein Code:

@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') 
+1

** Siehe auch: ** https://stackoverflow.com/questions/26513542/flask-how-to-send-a-dynamically-generate-zipfile-to-the-client – dreftymac

Antwort

22

BytesIO() Bedürfnisse Bytes Daten weitergegeben werden, aber ein ZipFile() Objekt ist nicht Byte-Daten; Sie haben tatsächlich eine Datei auf Ihrer Festplatte erstellt.

Sie können ein ZipFile() im Speicher erstellen, indem BytesIO()als Basis mit:

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) 

Die with Anweisung sorgt dafür, dass das ZipFile() Objekt richtig geschlossen wird, wenn Sie Einträge damit fertig sind, so dass es die schreiben erforderlicher Trailer zum speicherinternen Dateiobjekt. Der Aufruf memory_file.seek(0) wird benötigt, um die Lese-/Schreibposition des Dateiobjekts zurück zum Anfang zurückzuspulen.

Verwandte Themen