camera.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. from datetime import datetime
  2. from fastapi import APIRouter, HTTPException, Query, Response
  3. from app.services import (
  4. CameraCaptureError,
  5. CameraUnavailableError,
  6. get_camera_service,
  7. )
  8. router = APIRouter(
  9. prefix="/camera",
  10. tags=["camera"],
  11. )
  12. @router.api_route("/capture", methods=["GET"], summary="拍照并直接返回图片")
  13. def capture_image(
  14. download: bool = Query(
  15. default=False,
  16. description="是否以附件下载方式返回图片。默认 False,浏览器会直接预览。",
  17. ),
  18. ) -> Response:
  19. """
  20. 拍照接口。
  21. 调用这个接口时,服务会即时触发树莓派相机拍照,
  22. 然后把最新拍到的图片直接作为 HTTP 响应返回。
  23. """
  24. camera_service = get_camera_service()
  25. try:
  26. image_bytes = camera_service.capture_jpeg()
  27. except (CameraUnavailableError, CameraCaptureError) as exc:
  28. raise HTTPException(status_code=503, detail=str(exc)) from exc
  29. filename = f"capture_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg"
  30. disposition = "attachment" if download else "inline"
  31. return Response(
  32. content=image_bytes,
  33. media_type="image/jpeg",
  34. headers={
  35. "Content-Disposition": f'{disposition}; filename="{filename}"',
  36. "Cache-Control": "no-store",
  37. },
  38. )