使用zipfile模塊可以將多個文件打包成zip文件進行下載,但是常規的操作方式會在服務器磁盤上生成一個zip文件占用磁盤空間。
后引入BytesIO將文件寫入到內存中然后下載:
def dl_plan(pid):
"""
下載測試計划關聯的測試文件,分單個和多個文件情況(多個文件打包成zip下載)。
1. 計划只有一個文件則直接下載.xlsx文件
2. 計划有多個文件,則打包成zip通過BytesIO直接寫入到內存中,不在本地生成.zip文件。
:param pid
:return:
"""
dirpath = Config.FILE_UPLOAD_DIR
tp = TestPlan.objects.get_or_404(id=pid)
fp_test_files = tp.test_files
file_list = fp_test_files.split(",")
dl_name = '{}.zip'.format(tp.planname)
if len(file_list) == 1:
return send_from_directory(dirpath, fp_test_files, as_attachment=True)
else:
memory_file = BytesIO()
with zipfile.ZipFile(memory_file, "w", zipfile.ZIP_DEFLATED) as zf:
for _file in file_list:
with open(os.path.join(dirpath, _file), 'rb') as fp:
zf.writestr(_file, fp.read())
memory_file.seek(0)
return send_file(memory_file, attachment_filename=dl_name, as_attachment=True)
大體的代碼就是這些