2017-05-09 136 views
0

我使用Flask send_file來讓用戶下載一個zip文件。下載功能起作用,但每當用戶下載文件時,它會在我的my_project/app/中創建一個重複的zip文件。我似乎無法弄清楚重複文件是如何生成的。Flask send_file生成重複文件

@post_user_blueprint.route('/download_note/<string:ind_id>/', methods=['GET', 'POST']) 
def download_note(ind_id): 
    zip_name = "{0}_notes.zip".format(ind_id) 
    upload_path = current_app.config['UPLOAD_PATH'] 
    path = os.path.dirname(upload_path + "/documents/" + "/{0}/".format(ind_id)) 
    zipf = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) 
    for root, dirs, files in os.walk(path): 
     for file in files: 
      zipf.write(path + '/' + file, basename(path + '/' + file)) 
    zipf.close() 
    return send_file(zip_name, as_attachment=True) 

回答

0

代碼傳遞一個字符串,以zip文件的構造函數:

zip_name = "{0}_notes.zip".format(ind_id) 
zipf = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) 

ZipFile中解釋字符串作爲要在其中創建壓縮文件文件系統的位置,例如foo_notes.zip在當前目錄。

但是,您不想在磁盤上創建文件,您只需要在內存中創建它。

要做到這一點,通過一個BytesIO實例ZipFile的構造函數,而不是字符串:

from io import BytesIO 

@post_user_blueprint.route('/download_note/<string:ind_id>/', methods=['GET', 'POST']) 
def download_note(ind_id): 
    zip_buffer = BytesIO() 
    upload_path = current_app.config['UPLOAD_PATH'] 
    path = os.path.dirname(upload_path + "/documents/" + "/{0}/".format(ind_id)) 
    zipf = zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) 
    for root, dirs, files in os.walk(path): 
     for file in files: 
      zipf.write(path + '/' + file, basename(path + '/' + file)) 
    zipf.close() 
    return send_file(zip_name, as_attachment=True) 

現在zip文件的數據將被寫入BytesIO實例在內存中,而不是磁盤。