我使用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)
答案 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
实例,而不是写入磁盘。