diff --git a/change2/nohup.out b/change2/nohup.out index efa65e3..ee16d17 100644 --- a/change2/nohup.out +++ b/change2/nohup.out @@ -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 diff --git a/change2/service2.py b/change2/service2.py index 71b9386..243857b 100644 --- a/change2/service2.py +++ b/change2/service2.py @@ -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,12 +214,34 @@ 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) - tmp_path = tmp.name + # 根据配置转换图片格式并上传到 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: result_url = upload_to_oss(tmp_path, object_name) diff --git a/change3/nohup.out b/change3/nohup.out index b5ceacc..66a28d3 100644 --- a/change3/nohup.out +++ b/change3/nohup.out @@ -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 diff --git a/change3/service3.py b/change3/service3.py index 2490108..4aa59bb 100644 --- a/change3/service3.py +++ b/change3/service3.py @@ -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,12 +207,34 @@ 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) - tmp_path = tmp.name + # 根据配置转换图片格式并上传到 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: result_url = upload_to_oss(tmp_path, object_name) diff --git a/config.py b/config.py new file mode 100644 index 0000000..c25b375 --- /dev/null +++ b/config.py @@ -0,0 +1,9 @@ +""" +换装服务配置文件 +""" + +# 输出图片格式:'jpg' 或 'png' +OUTPUT_FORMAT = 'jpg' + +# JPG压缩质量 (1-100),仅在OUTPUT_FORMAT='jpg'时生效 +JPG_QUALITY = 85 diff --git a/nohup.out b/nohup.out index 68b145f..f3f7109 100644 --- a/nohup.out +++ b/nohup.out @@ -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 -