Flask send_file生成重复文件

时间:2017-05-09 19:37:25

标签: python flask

我使用Flask send_file让用户下载zip文件。下载功能有效,但每次用户下载文件时,都会在my_project/app/内创建一个重复的zip文件。我似乎无法弄清楚如何生成重复文件。

@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)

1 个答案:

答案 0 :(得分:0)

代码将字符串传递给ZipFile构造函数:

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

ZipFile将字符串解释为您要在其中创建zip文件的文件系统位置,例如当前目录中的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)

现在,zipfile的数据将被写入内存中的BytesIO实例,而不是写入磁盘。