from fastapi import APIRouter, UploadFile, File, Form, HTTPException, Request from fastapi.responses import StreamingResponse, JSONResponse from service import PtnToTshirtService from utils import jingrow_api_verify_and_billing from settings import settings import json import asyncio from typing import List, Optional import io router = APIRouter(prefix=settings.router_prefix) service = PtnToTshirtService() @router.post(settings.batch_route) @jingrow_api_verify_and_billing(api_name=settings.api_name) async def pattern_to_tshirt_batch(data: dict, request: Request): """ 批量处理多个URL花型图片 Args: data: 包含花型图片URL列表和配置参数的字典 request: FastAPI 请求对象 Returns: 流式响应,包含每个图片的处理结果 """ if "urls" not in data: raise HTTPException(status_code=400, detail="缺少urls参数") config = data.get("config", {}) # 支持传入T恤图片URL列表 if "tshirt_urls" in data and isinstance(data["tshirt_urls"], list): if not config: config = {} config["tshirt_urls"] = data["tshirt_urls"] async def process_and_stream(): total = len(data["urls"]) for index, url in enumerate(data["urls"], 1): try: result = await service.pattern_to_tshirt(url, config) result.update({ "index": index, "total": total, "original_url": url }) yield json.dumps(result) + "\n" except Exception as e: yield json.dumps({ "status": "error", "message": str(e), "index": index, "total": total, "original_url": url }) + "\n" try: return StreamingResponse( process_and_stream(), media_type="application/x-ndjson" ) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.post(settings.file_route) @jingrow_api_verify_and_billing(api_name=settings.api_name) async def pattern_to_tshirt_file(file: UploadFile = File(...), config: str = Form("{}"), tshirt_urls: str = None, request: Request = None): """ 将上传的花型文件添加到T恤上 Args: file: 上传的花型图片文件 config: JSON格式的配置参数 tshirt_urls: JSON格式的T恤图片URL列表 request: FastAPI 请求对象 Returns: 处理后的T恤图片内容 """ content = await file.read() # 解析配置参数 config_dict = {} if config: try: config_dict = json.loads(config) except json.JSONDecodeError: raise HTTPException(status_code=400, detail="配置参数格式错误") # 解析T恤图片URL列表 if tshirt_urls: try: urls_list = json.loads(tshirt_urls) if isinstance(urls_list, list): config_dict["tshirt_urls"] = urls_list except json.JSONDecodeError: raise HTTPException(status_code=400, detail="T恤图片URL列表格式错误") try: result = await service.pattern_to_tshirt_from_file(content, config_dict) return result except Exception as e: raise HTTPException(status_code=500, detail=f"处理图像失败: {str(e)}")