updload.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import hashlib
  2. import os
  3. import pathlib
  4. import re
  5. import sys
  6. sys.path.append(os.path.dirname(os.path.dirname(__file__)))
  7. import jwt
  8. from fastapi import FastAPI,APIRouter, File, HTTPException, Depends, Request,Header, UploadFile
  9. from fastapi.responses import JSONResponse
  10. from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
  11. import aiofiles
  12. from starlette.status import HTTP_401_UNAUTHORIZED
  13. from api.jwt import verify_jwt_token,get_current_user
  14. from config import *
  15. from db.docs import DocumentsRepository
  16. upload_router = APIRouter()
  17. security = HTTPBearer()
  18. @upload_router.post('/upload')
  19. async def upload(open_id=Depends(verify_jwt_token),file: UploadFile = File(...) ):
  20. res = await save_to_user_dir(open_id, file)
  21. if res:
  22. # 保存文件到本地
  23. DocumentsRepository()
  24. return {"message": "upload success"}
  25. else:
  26. # 保存文件失败,返回 400 Bad Request 或其他适当的错误状态码
  27. raise HTTPException(status_code=400, detail="upload fail")
  28. def is_valid_filename(s):
  29. """检查字符串是否只包含合法的文件名字符"""
  30. # 这里的正则表达式只允许字母、数字、下划线、点、破折号和空格
  31. # 你可以根据需要调整这个正则表达式
  32. return re.match(r"^[a-zA-Z0-9_.\- ]+$", s) is not None
  33. def get_user_dir(open_id):
  34. if is_valid_filename(open_id):
  35. # 如果open_id合法,直接使用它作为目录名
  36. user_dir = os.path.join(DATA_DIR, open_id)
  37. else:
  38. # 否则,计算它的哈希值并用作目录名
  39. hash_object = hashlib.md5(open_id.encode())
  40. hex_dig = hash_object.hexdigest()[:8] # 只取前 8 个字符
  41. user_dir = os.path.join(DATA_DIR, "hash8_" + hex_dig)
  42. # 如果目录不存在,创建它
  43. if not os.path.exists(user_dir):
  44. os.makedirs(user_dir)
  45. return user_dir
  46. async def save_to_user_dir(open_id, file:UploadFile):
  47. user_dir = get_user_dir(open_id)
  48. file_path = os.path.join(user_dir,"docs", file.filename)
  49. async with aiofiles.open(file_path, "wb") as buffer:
  50. chunk = await file.read(8192)
  51. while chunk:
  52. await buffer.write(chunk)
  53. chunk = await file.read(8192)
  54. logger.info(f"{open_id} save to {file_path}")
  55. return True