class TestCaseDownloadView(StaffRequiredMixin, SingleObjectMixin, View):
model = TestCase
@staticmethod
def zip_dir(path, output=None):
output = output or os.path.basename(path) + '.zip'
zip = zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED)
for root, dirs, files in os.walk(path):
relative_root = '' if root == path else root.replace(path, '') + os.sep
for filename in files:
zip.write(os.path.join(root, filename), relative_root + filename)
zip.close()
def get(self, request, *args, **kwargs):
testcase = self.get_object()
snapshots = testcase.detail.snapshots
gestures = [item['url'] for item in snapshots]
# 创建一个临时目录
temp_dir = tempfile.mkdtemp()
# 将要打包的图片放入临时目录中
for index, gesture in enumerate(gestures):
with open('%s/%s.jpg' % (temp_dir, index + 1), 'w') as f:
resp = requests.get(url=gesture)
f.write(resp.content)
zip_buffer = io.BytesIO()
self.zip_dir(temp_dir, zip_buffer)
# 将临时目录删除
# os.removedirs(temp_dir) # 删除非空目录会抛错
shutil.rmtree(temp_dir)
# 构造文件流的响应
response = HttpResponse(content_type='application/x-zip-compressed')
response['Content-Disposition'] = 'attachment; filename=test.zip'
response.write(zip_buffer.getvalue())
return response
django中响应zip文件
最新推荐文章于 2022-05-12 16:22:14 发布