FastAPI中如何返回携带描述信息的图片?
三种实现FastAPI同时返回图片和描述的方案
方案1:返回包含Base64图片和描述的JSON
把图片字节编码为Base64字符串,和描述一起封装在JSON响应里,前端可直接解析展示。
修改后的代码示例:
import base64 from fastapi import APIRouter, Response, Annotated, Depends, APIKeyHeader from your_module import PostInput, get_api_key_and_fetch_user_id, generate_post_for_user router = APIRouter() @router.post("/generate-post") async def post( post_input: PostInput, user_id: Annotated[APIKeyHeader, Depends(get_api_key_and_fetch_user_id)], ): response = await generate_post_for_user(post_input.dict(), user_id) image_bytes = response["image"] # 将图片字节编码为Base64字符串 image_base64 = base64.b64encode(image_bytes).decode("utf-8") # 返回包含描述和Base64图片的JSON return { "description": "Image of Patrick", "image": f"data:image/png;base64,{image_base64}" }
方案2:通过响应头传递描述
保持图片的二进制响应不变,把描述放在自定义HTTP响应头中,前端可读取响应头获取描述信息。
修改后的代码示例:
from fastapi import APIRouter, Response, Annotated, Depends, APIKeyHeader from your_module import PostInput, get_api_key_and_fetch_user_id, generate_post_for_user router = APIRouter() @router.post("/generate-post") async def post( post_input: PostInput, user_id: Annotated[APIKeyHeader, Depends(get_api_key_and_fetch_user_id)], ): response = await generate_post_for_user(post_input.dict(), user_id) image_bytes = response["image"] # 添加自定义响应头存储描述 headers = {"X-Image-Description": "Image of Patrick"} return Response(content=image_bytes, media_type="image/png", headers=headers)
方案3:返回Multipart多部分响应
使用FastAPI的MultipartResponse,将图片和描述作为两个独立的部分返回,适合需要分开处理二进制和文本的场景。
修改后的代码示例:
from fastapi import APIRouter, Annotated, Depends, APIKeyHeader from fastapi.responses import MultipartResponse from your_module import PostInput, get_api_key_and_fetch_user_id, generate_post_for_user router = APIRouter() @router.post("/generate-post") async def post( post_input: PostInput, user_id: Annotated[APIKeyHeader, Depends(get_api_key_and_fetch_user_id)], ): response = await generate_post_for_user(post_input.dict(), user_id) image_bytes = response["image"] # 构造多部分响应内容 parts = [ # 文本描述部分 ("description", "Image of Patrick"), # 图片部分 ("image", ("image.png", image_bytes, "image/png")) ] return MultipartResponse(parts)
内容的提问来源于stack exchange,提问作者Zeus
相关产品推荐
相关产品推荐

