2025-05-12 02:39:56 +08:00

106 lines
3.4 KiB
Python

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