【Flask】下载多个文件

使用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)

 

posted @ 2018-03-01 11:32  小小易拉罐  阅读(1327)  评论(0编辑  收藏  举报