initial commit
This commit is contained in:
38
apps/createSeiTaiDocument/extensions/download_response.py
Normal file
38
apps/createSeiTaiDocument/extensions/download_response.py
Normal file
@@ -0,0 +1,38 @@
|
||||
import os, io
|
||||
from typing import List
|
||||
import zipfile
|
||||
from pathlib import Path
|
||||
from django.conf import settings
|
||||
from utils.path_utils import project_path
|
||||
from utils.chen_response import ChenResponse
|
||||
from django.http import FileResponse, HttpResponse
|
||||
|
||||
main_download_path = Path(settings.BASE_DIR) / 'media'
|
||||
|
||||
def get_file_respone(id: int, file_name: str | List[str]):
|
||||
"""将生成文档下载响应"""
|
||||
# 1.如果传入的是str,直接是文件名
|
||||
if isinstance(file_name, str):
|
||||
file_name = "".join([file_name, '.docx'])
|
||||
file_abs_path = main_download_path / project_path(id) / 'final_seitai' / file_name
|
||||
if not file_abs_path.is_file():
|
||||
return ChenResponse(status=404, code=404, message="文档未生成或生成错误!")
|
||||
response = FileResponse(open(file_abs_path, 'rb'))
|
||||
response['Content-Type'] = 'application/octet-stream'
|
||||
response['Content-Disposition'] = f"attachment; filename={file_name}.docx"
|
||||
return response
|
||||
# 2.如果传入的是列表,多个文件名
|
||||
elif isinstance(file_name, list):
|
||||
file_name_list = file_name
|
||||
zip_buffer = io.BytesIO()
|
||||
with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zip_file:
|
||||
for file_name in file_name_list:
|
||||
file_name = "".join([file_name, '.docx'])
|
||||
file_abs_path = main_download_path / project_path(id) / 'final_seitai' / file_name
|
||||
zip_file.write(file_abs_path, os.path.basename(file_abs_path))
|
||||
zip_buffer.seek(0)
|
||||
response = HttpResponse(zip_buffer, content_type='application/zip')
|
||||
response['Content-Disposition'] = 'attachment; filename="回归测试说明文档.zip"'
|
||||
return response
|
||||
else:
|
||||
return ChenResponse(code=500, status=500, message='下载文档出现错误,确认是否有多个轮次内容')
|
||||
Reference in New Issue
Block a user