| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- 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",
- },
- )
|