使用zipfile模块可以将多个文件打包成zip文件进行下载,但是常规的操作方式会在服务器磁盘上生成一个zip文件占用磁盘空间。
后引入BytesIO将文件写入到内存中然后下载:
1 def dl_plan(pid): 2 """ 3 下载测试计划关联的测试文件,分单个和多个文件情况(多个文件打包成zip下载)。 4 1. 计划只有一个文件则直接下载.xlsx文件 5 2. 计划有多个文件,则打包成zip通过BytesIO直接写入到内存中,不在本地生成.zip文件。 6 :param pid 7 :return: 8 """ 9 10 dirpath = Config.FILE_UPLOAD_DIR 11 tp = TestPlan.objects.get_or_404(id=pid) 12 fp_test_files = tp.test_files 13 file_list = fp_test_files.split(",") 14 dl_name = '{}.zip'.format(tp.planname) 15 16 if len(file_list) == 1: 17 return send_from_directory(dirpath, fp_test_files, as_attachment=True) 18 else: 19 memory_file = BytesIO() 20 with zipfile.ZipFile(memory_file, "w", zipfile.ZIP_DEFLATED) as zf: 21 for _file in file_list: 22 with open(os.path.join(dirpath, _file), 'rb') as fp: 23 zf.writestr(_file, fp.read()) 24 memory_file.seek(0) 25 return send_file(memory_file, attachment_filename=dl_name, as_attachment=True)