2017-05-09 4 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) 

ZIPファイルは、カレントディレクトリの例foo_notes.zipのために、あなたはzipファイルを作成したいファイルシステムの場所として文字列を解釈します。

ただし、ディスクにファイルを作成したくない場合は、メモリに作成するだけです。この、ZipFileのコンストラクタではなく、文字列にBytesIOインスタンスを渡す行うに

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インスタンスに書き込まれます。

関連する問題