Compare commits

1 Commits
Author SHA1 Message Date
Your Name 8309e6a657 save 2026-03-13 03:21:38 +00:00
6 changed files with 201 additions and 12 deletions
+4
View File
@@ -4,3 +4,7 @@ INFO: Started server process [9669]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:12222 (Press CTRL+C to quit)
静态文件目录: /root/change_cloth_server/change2/static
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fed977afcf238470ca7418061517bcd14.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730545&Signature=CAO%2B7BQg22JrmiSJ%2B%2FqiZPPaJV8%3D
INFO: 127.0.0.1:34020 - "POST /try-on HTTP/1.1" 200 OK
+33 -5
View File
@@ -11,12 +11,18 @@ import base64
import io
import json
import os
import sys
import tempfile
import time
import uuid
from pathlib import Path
# 添加父目录到路径以导入config
sys.path.insert(0, str(Path(__file__).parent.parent))
import config
import httpx
from PIL import Image
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse
@@ -208,11 +214,33 @@ async def try_on(req: TryOnRequest):
async with httpx.AsyncClient(timeout=30.0) as dl_client:
result_bytes = await fetch_image_bytes(dl_client, filename, subfolder, type_)
# 将图片保存到临时文件,上传到 OSS
suffix = Path(filename).suffix or ".png"
object_name = f"tryon/{uuid.uuid4().hex}{suffix}"
with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as tmp:
tmp.write(result_bytes)
# 根据配置转换图片格式并上传到 OSS
output_format = config.OUTPUT_FORMAT.lower()
file_ext = '.jpg' if output_format == 'jpg' else '.png'
object_name = f"tryon/{uuid.uuid4().hex}{file_ext}"
# 使用PIL处理图片
img = Image.open(io.BytesIO(result_bytes))
if output_format == 'jpg':
# JPG格式:转换为RGB模式
if img.mode in ('RGBA', 'LA', 'P'):
rgb_img = Image.new('RGB', img.size, (255, 255, 255))
if img.mode == 'P':
img = img.convert('RGBA')
rgb_img.paste(img, mask=img.split()[-1] if img.mode in ('RGBA', 'LA') else None)
img = rgb_img
elif img.mode != 'RGB':
img = img.convert('RGB')
# 保存为JPG
with tempfile.NamedTemporaryFile(suffix='.jpg', delete=False) as tmp:
img.save(tmp, format='JPEG', quality=config.JPG_QUALITY)
tmp_path = tmp.name
else:
# PNG格式:保持原样
with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp:
img.save(tmp, format='PNG')
tmp_path = tmp.name
try:
+87
View File
@@ -8,3 +8,90 @@ INFO: Uvicorn running on http://0.0.0.0:12223 (Press CTRL+C to quit)
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F627bcee434384a7b847faf2dbbce90ae.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730306&Signature=aATPXbjJCE3ArJnYfRyvSVSI8EE%3D
INFO: 127.0.0.1:39178 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F6b801985147c47e48a6ad89b4c0cd38d.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730384&Signature=PL28YpFYPBBTSkctaxdvQu%2F%2FefQ%3D
INFO: 127.0.0.1:44510 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fba82fba2546a4db494b57afe11b7a94e.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730474&Signature=6nEr1IdPNILxYlOq5A0HhwThgB4%3D
INFO: 127.0.0.1:58438 - "POST /try-on HTTP/1.1" 200 OK
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fdef87868715448de972942060caeb7ff.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730502&Signature=lSklN83c3u5nFYmvUIrWkho0JmA%3D
INFO: 127.0.0.1:40984 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F48012034e9ec4fbcbc301bde9ea2833c.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730617&Signature=fcu%2BZDgr033DQojMCQj6h4gnds4%3D
INFO: 127.0.0.1:60844 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F081b8dfef8354b1c99e4e4ee11331292.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730641&Signature=gfdUA13vEyxRLdS%2BuxL%2FIKIntbU%3D
INFO: 127.0.0.1:45998 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Ff60f41ea7cf6433ca231ff20f5b30e23.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730672&Signature=GU0ILZWnxUaNDJQ3iWdlqTdQJfk%3D
INFO: 127.0.0.1:41238 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F9f09e890bc2e4575aca8d393c9abba7a.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730696&Signature=PXS1wcx709%2FTZ%2Bxivv665u3UqFs%3D
INFO: 127.0.0.1:55808 - "POST /try-on HTTP/1.1" 200 OK
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F9df0b0ad8722441fa935ff7fe8fb1e75.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730727&Signature=E%2BFspFCXNNWPC4bJ7AwG99sQCVA%3D
INFO: 127.0.0.1:55810 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fec3e4af4c75945109f42047f87951c89.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730758&Signature=XaCCU2X2RlBHl9PYqcJ2rXEIZpI%3D
INFO: 127.0.0.1:55908 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F56324fe2dd0a40a3bf54150c147c3aea.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730789&Signature=e2VXdJK9m6cDqW18RkLTVEfOtV8%3D
INFO: 127.0.0.1:40940 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F099d57b365444a4e8ac36052d99d387d.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730819&Signature=FgIniNm8joNa0TK1WsEa7D2u%2BNU%3D
INFO: 127.0.0.1:49448 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F7c8cfa4ac1214d84843589e8ea255bcf.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730850&Signature=2goSdjNp7haPHXS%2BJ%2BAlLaFCR4Y%3D
INFO: 127.0.0.1:51658 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F64264e7412c0456b845ae8b7d6be49c7.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730881&Signature=JEjE%2FqkQgQkdjy4yU%2BUG%2F6TLHAM%3D
INFO: 127.0.0.1:52690 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fbffee82977644843af3f8934a4dfc6f6.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730912&Signature=M8yFTC4HzUdialZSniwqJhxVDX8%3D
INFO: 127.0.0.1:52570 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F175eceeea0294f23883ced29955d8c24.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730943&Signature=G8KPeNFe0cc02jW5LUsainkwY4s%3D
INFO: 127.0.0.1:32838 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fceb407de7f7c48ccb35bf220aa3b974d.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730973&Signature=%2FQZVQVZ%2BJcvYkIf3ikTOIL6jmNY%3D
INFO: 127.0.0.1:59962 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F26ea45ae412842a6ab681d836625c4da.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731004&Signature=rvipO3wVQ3202yRWOeiOJNY28Dg%3D
INFO: 127.0.0.1:40790 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F8fb321a9a86b49c3a2386f04b6874e6f.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731030&Signature=1TS3LGwQa3vZ8YHQBMl7wu62vTc%3D
INFO: 127.0.0.1:35550 - "POST /try-on HTTP/1.1" 200 OK
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F61e5865a46d649409ca6e34111aeb644.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731059&Signature=lbstfeJxP8zjiSiMY6gQBz4zajw%3D
INFO: 127.0.0.1:39236 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F5fda63d3db4b4d368cdf749ff6f53f09.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731090&Signature=6fFxh9tL2ks8jaDVgeT3rlZzbBQ%3D
INFO: 127.0.0.1:40194 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Ff4ab353137fc40f5874674df347a1c49.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731120&Signature=W8RQMPZgm8c4R4es8MPKkAulgxM%3D
INFO: 127.0.0.1:38234 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F2ec4c18d401245fc980645fd4847080b.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731151&Signature=OlnjmSM4nIKux7tApMTKkK%2FSbFY%3D
INFO: 127.0.0.1:43854 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F21c7139693994b3f83233dccb138dd6d.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731184&Signature=KQgU2K1IcmInb7XVnYO335q9IVk%3D
INFO: 127.0.0.1:56958 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F01b2301697624f1189aa86faca8a77f7.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731217&Signature=zuwm%2Bp2NGTJc4jC0k4qZyT583S0%3D
INFO: 127.0.0.1:45370 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Ffe17b4da3615421a90e4221e8eea46b4.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731248&Signature=9coHZI%2F3IEJCoERdMOq5CVTatNw%3D
INFO: 127.0.0.1:43270 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fbd9cc49fb54d4c51a910b63eedea1502.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731279&Signature=aACepaPGN0zeXDigrzRUN%2BCItlQ%3D
INFO: 127.0.0.1:33848 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F4814bf67eeac46dbbfc2b4b79c0f2adb.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731369&Signature=XksUlhVY7ii8jevDLvg9n8qNXhg%3D
INFO: 127.0.0.1:42736 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F0ea64d04225941e583493149e2e662ad.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731580&Signature=xTTQsyRZXx5kddb1C4j%2FEDAVyko%3D
INFO: 127.0.0.1:60680 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F08deeffce6c74498952b8202d2763340.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731705&Signature=EYVRhvk4zecJIwxqTybdATVpKLI%3D
INFO: 127.0.0.1:46922 - "POST /try-on HTTP/1.1" 200 OK
+33 -5
View File
@@ -11,13 +11,19 @@ import base64
import io
import json
import os
import sys
import tempfile
import time
import uuid
from pathlib import Path
# 添加父目录到路径以导入config
sys.path.insert(0, str(Path(__file__).parent.parent))
import config
import httpx
import oss2
from PIL import Image
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse
@@ -201,11 +207,33 @@ async def try_on(req: TryOnRequest):
async with httpx.AsyncClient(timeout=30.0) as dl_client:
result_bytes = await fetch_image_bytes(dl_client, filename, subfolder, type_)
# 将图片保存到临时文件,上传到 OSS
suffix = Path(filename).suffix or ".png"
object_name = f"tryon/{uuid.uuid4().hex}{suffix}"
with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as tmp:
tmp.write(result_bytes)
# 根据配置转换图片格式并上传到 OSS
output_format = config.OUTPUT_FORMAT.lower()
file_ext = '.jpg' if output_format == 'jpg' else '.png'
object_name = f"tryon/{uuid.uuid4().hex}{file_ext}"
# 使用PIL处理图片
img = Image.open(io.BytesIO(result_bytes))
if output_format == 'jpg':
# JPG格式:转换为RGB模式
if img.mode in ('RGBA', 'LA', 'P'):
rgb_img = Image.new('RGB', img.size, (255, 255, 255))
if img.mode == 'P':
img = img.convert('RGBA')
rgb_img.paste(img, mask=img.split()[-1] if img.mode in ('RGBA', 'LA') else None)
img = rgb_img
elif img.mode != 'RGB':
img = img.convert('RGB')
# 保存为JPG
with tempfile.NamedTemporaryFile(suffix='.jpg', delete=False) as tmp:
img.save(tmp, format='JPEG', quality=config.JPG_QUALITY)
tmp_path = tmp.name
else:
# PNG格式:保持原样
with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp:
img.save(tmp, format='PNG')
tmp_path = tmp.name
try:
+9
View File
@@ -0,0 +1,9 @@
"""
换装服务配置文件
"""
# 输出图片格式:'jpg' 或 'png'
OUTPUT_FORMAT = 'jpg'
# JPG压缩质量 (1-100),仅在OUTPUT_FORMAT='jpg'时生效
JPG_QUALITY = 85
+33
View File
@@ -8,3 +8,36 @@
* Running on http://10.60.190.115:28888
Press CTRL+C to quit
1.202.76.38 - - [13/Mar/2026 02:51:46] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:53:04] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:53:59] "GET /static/index.html HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:53:59] "GET /favicon.ico HTTP/1.1" 404 -
113.65.31.176 - - [13/Mar/2026 02:54:34] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:55:02] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:55:45] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:56:57] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:57:21] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:57:52] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:58:16] "POST /change_cloth_base64 HTTP/1.1" 200 -
180.163.30.27 - - [13/Mar/2026 02:58:21] "GET / HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:58:47] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:59:18] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:59:49] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:00:19] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:00:50] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:01:21] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:01:52] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:02:23] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:02:53] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:03:24] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:03:50] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:04:19] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:04:50] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:05:20] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:05:51] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:06:24] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:06:57] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:07:28] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:07:59] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:09:29] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:13:00] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:15:05] "POST /change_cloth_base64 HTTP/1.1" 200 -