from datetime import datetime from fastapi import APIRouter, HTTPException, Query, Response from app.services import ( CameraCaptureError, CameraUnavailableError, get_camera_service, ) router = APIRouter( prefix="/camera", tags=["camera"], ) @router.api_route("/capture", methods=["GET"], summary="拍照并直接返回图片") def capture_image( download: bool = Query( default=False, description="是否以附件下载方式返回图片。默认 False,浏览器会直接预览。", ), ) -> Response: """ 拍照接口。 调用这个接口时,服务会即时触发树莓派相机拍照, 然后把最新拍到的图片直接作为 HTTP 响应返回。 """ camera_service = get_camera_service() try: image_bytes = camera_service.capture_jpeg() except (CameraUnavailableError, CameraCaptureError) as exc: raise HTTPException(status_code=503, detail=str(exc)) from exc filename = f"capture_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" disposition = "attachment" if download else "inline" return Response( content=image_bytes, media_type="image/jpeg", headers={ "Content-Disposition": f'{disposition}; filename="{filename}"', "Cache-Control": "no-store", }, )