controller.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from pathlib import Path
  2. from typing import Annotated
  3. from fastapi import (
  4. APIRouter,
  5. BackgroundTasks,
  6. Body,
  7. Depends,
  8. Request,
  9. UploadFile,
  10. )
  11. from fastapi.responses import FileResponse, JSONResponse
  12. from app.common.response import ResponseSchema, SuccessResponse, UploadFileResponse
  13. from app.core.dependencies import AuthPermission
  14. from app.core.logger import log
  15. from app.core.router_class import OperationLogRoute
  16. from app.utils.upload_util import UploadUtil
  17. from .service import FileService
  18. FileRouter = APIRouter(route_class=OperationLogRoute, prefix="/file", tags=["文件管理"])
  19. @FileRouter.post(
  20. "/upload",
  21. summary="上传文件",
  22. description="上传文件",
  23. response_model=ResponseSchema[dict],
  24. dependencies=[Depends(AuthPermission(["module_common:file:upload"]))],
  25. )
  26. async def upload_controller(
  27. file: UploadFile,
  28. request: Request,
  29. ) -> JSONResponse:
  30. """
  31. 上传文件
  32. 参数:
  33. - file (UploadFile): 上传的文件
  34. - request (Request): 请求对象
  35. 返回:
  36. - JSONResponse: 包含上传文件详情的JSON响应
  37. """
  38. result_dict = await FileService.upload_service(base_url=str(request.base_url), file=file)
  39. log.info(f"上传文件成功 {result_dict}")
  40. return SuccessResponse(data=result_dict, msg="上传文件成功")
  41. @FileRouter.post(
  42. "/download",
  43. summary="下载文件",
  44. description="下载文件",
  45. dependencies=[Depends(AuthPermission(["module_common:file:download"]))],
  46. )
  47. async def download_controller(
  48. background_tasks: BackgroundTasks,
  49. file_path: Annotated[str, Body(description="文件路径")],
  50. delete: Annotated[bool, Body(description="是否删除文件")] = False,
  51. ) -> FileResponse:
  52. """
  53. 下载文件
  54. 参数:
  55. - background_tasks (BackgroundTasks): 后台任务对象
  56. - file_path (str): 文件路径
  57. - delete (bool): 是否删除文件
  58. 返回:
  59. - FileResponse: 包含下载文件的响应
  60. """
  61. result = await FileService.download_service(file_path=file_path)
  62. if delete:
  63. background_tasks.add_task(UploadUtil.delete_file, Path(result.file_path))
  64. log.info("下载文件成功")
  65. return UploadFileResponse(file_path=result.file_path, filename=result.file_name)