2014-12-06 13 views
13

Mam serwer z kolbą, który pobiera dane binarne dla kilku różnych plików z bazy danych i umieszcza je w pythonowym obiekcie "zipfile". Chcę wysłać wygenerowany plik ZIP z moim kodem za pomocą metody "send_file" skrzynki.Jak wysłać pliki zip do frameworka Python?

Początkowo mogłem pomyślnie wysyłać pliki z non-spakowaniem, używając BytesIO (bin) jako pierwszego argumentu dla send_file, ale z jakiegoś powodu nie mogę zrobić tego samego z wygenerowanym plikiem zip. Daje błąd:

"ZipFile" nie ma interfejsu bufora.

Jak wysłać obiekt zip do użytkownika za pomocą Flask?

To jest mój kod:

@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

** Zobacz także: ** https://stackoverflow.com/questions/26513542/flask-how-to-send-a-dynamically- genera-z-zipfile-do-the-client – dreftymac

Odpowiedz

22

BytesIO() należy przekazać bajtów danych, ale obiekt nie jest ZipFile()-bajtów danych; faktycznie utworzyłeś plik na dysku twardym.

Można utworzyć ZipFile() w pamięci za pomocą BytesIO()jako podstawa:

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) 

Oświadczenie with zapewnia, że ​​obiekt ZipFile() jest prawidłowo zamknięty po zakończeniu dodawania wpisów, powodując jej napisać wymagane zwiastowanie do obiektu pliku w pamięci. Wywołanie memory_file.seek(0) jest potrzebne, aby "cofnąć" pozycję odczytu i zapisu obiektu pliku z powrotem na początek.

Powiązane problemy