|
|
from fastapi import HTTPException
|
|
|
|
|
|
import re
|
|
|
import os
|
|
|
import logging
|
|
|
import shutil
|
|
|
|
|
|
from app.tools.doc2docx import doc2docx
|
|
|
|
|
|
# # word上传格式要求
|
|
|
# ALLOWED_EXTENSIONS_DOC = {
|
|
|
# 'application/msword',
|
|
|
# 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
|
|
|
# }
|
|
|
#
|
|
|
# # excel上传格式要求
|
|
|
# ALLOWED_EXTENSIONS_EXCEL = {
|
|
|
# 'application/vnd.ms-excel',
|
|
|
# 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
|
# }
|
|
|
|
|
|
# 获取日志记录器
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
# 验证上传的文件是否符合要求
|
|
|
def verification_files(file, UPLOAD_DIR, file_type, exception_type):
|
|
|
try:
|
|
|
# 检查文件类型
|
|
|
if file.content_type not in file_type:
|
|
|
raise HTTPException(status_code=400, detail="文件类型不支持")
|
|
|
|
|
|
# 判断各个文件名是否符合该上传需求
|
|
|
# 如果文件名与实际需要的文件不匹配,则抛出异常
|
|
|
if not re.search(file.filename[3:11], exception_type):
|
|
|
raise HTTPException(status_code=400, detail=f"请传入{exception_type}")
|
|
|
|
|
|
# 先判断文件是否已经上传,如果已经上传,则删除旧的,保存新的
|
|
|
# 保存文件到对应的位置,判断是否已经存在相关文件,如果有,则删除旧的
|
|
|
if os.path.exists(UPLOAD_DIR) and len(os.listdir(UPLOAD_DIR)) > 0:
|
|
|
for file_name in os.listdir(UPLOAD_DIR):
|
|
|
if re.search(file_name[3:11], exception_type):
|
|
|
os.remove(os.path.join(UPLOAD_DIR, file_name))
|
|
|
logger.info(f"删除旧文件{file_name}")
|
|
|
|
|
|
# 不管是不是有文件,都走这一步
|
|
|
logger.info(f"开始上传{exception_type}")
|
|
|
# 如果文件夹不存在,则新建
|
|
|
if not os.path.exists(UPLOAD_DIR):
|
|
|
os.makedirs(UPLOAD_DIR)
|
|
|
|
|
|
file_path = os.path.join(UPLOAD_DIR, file.filename)
|
|
|
|
|
|
with open(file_path, "wb") as buffer:
|
|
|
shutil.copyfileobj(file.file, buffer)
|
|
|
|
|
|
# 如果上传为doc,需要转成docx
|
|
|
if file_path.endswith(".doc"):
|
|
|
doc2docx(file_path)
|
|
|
logger.info(f"文件{file.filename}格式转换为docx成功")
|
|
|
|
|
|
# elif file_path.endswith('.xls'):
|
|
|
#
|
|
|
# xls2xlsx(file_path)
|
|
|
# logger.info(f'文件{file.filename}格式转换为xlsx成功')
|
|
|
|
|
|
except Exception as e:
|
|
|
logger.error(f"文档格式校验失败:{e}")
|
|
|
raise HTTPException(status_code=500, detail=f"文档格式校验失败{e}")
|