!9 修复 WriteXlsx 使用 static 创建默认 excel 问题

Merge pull request !9 from ktianc/master
This commit is contained in:
ktianc 2024-02-07 13:50:49 +00:00 committed by Gitee
commit 09abd68f8e
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
2 changed files with 55 additions and 20 deletions

View File

@ -16,7 +16,7 @@ import xlsxwriter
from typing import List
from application.settings import STATIC_ROOT, STATIC_URL
from utils.file.file_base import FileBase
from utils.tools import generate_string
from pathlib import Path
class WriteXlsx:
@ -38,13 +38,19 @@ class WriteXlsx:
:param save_static: 保存方式 static 静态资源或者临时文件
:return:
"""
if not file_path or (file_path and not os.path.abspath(file_path)):
if not file_path:
if save_static:
self.file_path = FileBase.generate_static_file_path("write_xlsx", file_path)
self.file_path = FileBase.generate_static_file_path(path="write_xlsx", suffix="xlsx")
else:
self.file_path = FileBase.generate_temp_file_path(f"{generate_string(8)}.xlsx")
self.file_path = FileBase.generate_temp_file_path(suffix="xlsx")
elif not os.path.isabs(file_path):
if save_static:
self.file_path = FileBase.generate_static_file_path(path="write_xlsx", filename=file_path)
else:
self.file_path = FileBase.generate_temp_file_path(filename=file_path)
else:
self.file_path = file_path
Path(self.file_path).parent.mkdir(parents=True, exist_ok=True)
self.sheet_name = sheet_name
self.wb = xlsxwriter.Workbook(self.file_path)
self.sheet = self.wb.add_worksheet(sheet_name)
@ -121,4 +127,3 @@ class WriteXlsx:
print("write_xlsx 生成文件:", self.file_path)
raise ValueError("生成文件为临时文件,无法访问!")

View File

@ -11,7 +11,7 @@ import os
from pathlib import Path
from aiopathlib import AsyncPath
from fastapi import UploadFile
from application.settings import TEMP_DIR
from application.settings import TEMP_DIR, STATIC_ROOT
from core.exception import CustomException
from utils import status
from utils.tools import generate_string
@ -25,30 +25,61 @@ class FileBase:
ALL_ACCEPT = [*IMAGE_ACCEPT, *VIDEO_ACCEPT, *AUDIO_ACCEPT]
@classmethod
def generate_static_file_path(cls, path: str, filename: str) -> str:
def get_random_filename(cls, suffix: str) -> str:
"""
生成文件路径
:param path: static 指定目录类别
:param filename: 文件名称
生成随机文件名称生成规则当前时间戳 + 8位随机字符串拼接
:param suffix: 文件后缀
:return:
"""
if not suffix.startswith("."):
suffix = "." + suffix
return f"{str(int(datetime.datetime.now().timestamp())) + str(generate_string(8))}{suffix}"
@classmethod
def get_today_timestamp(cls) -> str:
"""
获取当天时间戳
:return:
"""
return str(int((datetime.datetime.now().replace(hour=0, minute=0, second=0)).timestamp()))
@classmethod
def generate_static_file_path(cls, path: str, filename: str = None, suffix: str = None) -> str:
"""
生成 static 静态文件路径生成规则自定义目录/当天日期时间戳/随机文件名称
1. filename 参数或者 suffix 参数必须填写一个
2. filename 参数和 suffix 参数都存在则优先取 suffix 参数为后缀
:param path: static 指定目录类别
:param filename: 文件名称
:param suffix: 文件后缀
:return:
"""
if not filename and not suffix:
raise ValueError("filename 参数或者 suffix 参数必须填写一个")
elif not suffix and filename:
suffix = os.path.splitext(filename)[-1]
path = path.replace("\\", "/")
if path[0] == "/":
path = path[1:]
if path[-1] == "/":
path = path[:-1]
today = str(int((datetime.datetime.now().replace(hour=0, minute=0, second=0)).timestamp()))
_filename = str(int(datetime.datetime.now().timestamp())) + str(generate_string(8))
return f"{path}/{today}/{_filename}{os.path.splitext(filename)[-1]}"
return f"{STATIC_ROOT}/{path}/{cls.get_today_timestamp()}/{cls.get_random_filename(suffix)}"
@classmethod
def generate_temp_file_path(cls, filename: str) -> str:
def generate_temp_file_path(cls, filename: str = None, suffix: str = None) -> str:
"""
生成临时文件路径
生成临时文件路径生成规则
1. filename 参数或者 suffix 参数必须填写一个
2. filename 参数和 suffix 参数都存在则优先取 suffix 参数为后缀
:param filename: 文件名称
:param suffix: 文件后缀
:return:
"""
return f"{cls.generate_temp_dir_path()}/{filename}"
if not filename and not suffix:
raise ValueError("filename 参数或者 suffix 参数必须填写一个")
elif not suffix and filename:
suffix = os.path.splitext(filename)[-1]
return f"{cls.generate_temp_dir_path()}/{cls.get_random_filename(suffix)}"
@classmethod
def generate_temp_dir_path(cls) -> str:
@ -58,10 +89,9 @@ class FileBase:
"""
date = datetime.datetime.strftime(datetime.datetime.now(), "%Y%m%d")
file_dir = Path(TEMP_DIR) / date
path = file_dir / (generate_string(4) + str(int(datetime.datetime.now().timestamp())))
if not path.exists():
path.mkdir(parents=True, exist_ok=True)
return str(path).replace("\\", "/")
if not file_dir.exists():
file_dir.mkdir(parents=True, exist_ok=True)
return str(file_dir).replace("\\", "/")
@classmethod
async def async_generate_temp_file_path(cls, filename: str) -> str: