daily/Router/FileRouter.py

73 lines
3.1 KiB
Python
Raw Normal View History

2023-03-07 16:42:34 +08:00
import os
from pathlib import Path
from fastapi import APIRouter, UploadFile, File, Depends, HTTPException, Header
2023-03-07 16:42:34 +08:00
from sqlalchemy.orm import Session
from Crud import FileCrud
from Schemas.UserSchemas import TokenData
from Utils.CommonUtils import file_md5
from Utils.SqlAlchemyUtils import get_db
from Schemas import FileSechemas
from Utils.AuthUtils import token_data_depend
from base64 import b64decode
2023-04-17 17:00:29 +08:00
router = APIRouter(prefix="/api/daily/file", tags=["文件"])
2023-03-07 16:42:34 +08:00
allow_file_type = {
'image',
'audio',
'video',
"application"
}
2023-04-20 15:34:30 +08:00
@router.post('/file_upload', response_model=FileSechemas.UserFileInfo, summary='文件上次')
def file_upload(name: str = Header(None), file: UploadFile = File(...),
2023-03-07 16:42:34 +08:00
db: Session = Depends(get_db), token_data: TokenData = Depends(token_data_depend)):
if name:
name=b64decode(name.encode('utf-8')).decode('utf-8')
2023-03-07 16:42:34 +08:00
mime_type = file.content_type
common_type, file_type = file.content_type.split('/')
if common_type not in allow_file_type:
raise Exception('不允许上传该类型文件')
content_start = file.file.read(1024)
file_md = file_md5(content_start)
2023-04-20 15:34:30 +08:00
save_path = Path(f"static_data/upload_files/{common_type}/{file_type}")
2023-03-07 16:42:34 +08:00
file_save_path = save_path / file_md
2023-04-20 15:34:30 +08:00
file_url = f'/static_data/upload_files/{common_type}/{file_type}/{file_md}'
2023-03-07 16:42:34 +08:00
if not os.path.exists(save_path):
os.makedirs(save_path)
user_file = FileCrud.get_file_by_md(db, file_md)
if not user_file:
if not os.path.exists(file_save_path):
with open(file_save_path, 'wb') as f:
f.write(content_start)
while True:
content = file.file.read(10240)
if content:
f.write(content)
else:
break
user_file = FileCrud.add_file(db,
FileSechemas.UserFileCreate(md=file_md, file_name=name or file.filename,
2023-03-07 16:42:34 +08:00
mime_type=mime_type,
user_id=token_data.email, common_type=common_type,
file_url=file_url))
return user_file.to_dict()
2023-04-20 15:34:30 +08:00
@router.post("/query", response_model=FileSechemas.UserFileQueryRes, summary='文件查询')
2023-03-07 16:42:34 +08:00
def query(req: FileSechemas.UserFileQuery, token_data: TokenData = Depends(token_data_depend),
db: Session = Depends(get_db)):
2023-04-17 14:09:22 +08:00
# if req.user_id and req.user_id != token_data.email:
# raise HTTPException(detail='无权查询其他用户文件', status_code=403)
2023-03-07 16:42:34 +08:00
count, items = FileCrud.file_query(db, req)
item_list = [item.to_dict() for item in items]
return FileSechemas.UserFileQueryRes(count=count, item_list=item_list)
2023-04-20 15:34:30 +08:00
@router.post("/get", response_model=FileSechemas.UserFileInfo, summary='文件获取')
def query(req: FileSechemas.UserFileGet,
db: Session = Depends(get_db)):
file = FileCrud.file_get(db, req.md)
if not file:
raise HTTPException(detail="未找到文件", status_code=404)
return file.to_dict()