fix: support url-based work downloads

This commit is contained in:
2026-03-08 23:11:02 +08:00
parent 3d91cd68a1
commit 5ff85debdc

View File

@@ -5,6 +5,7 @@ from sqlalchemy import desc
from typing import List from typing import List
import os import os
import mimetypes import mimetypes
from urllib.parse import urlparse
from app.core.database import get_db from app.core.database import get_db
from app.models.work import Work from app.models.work import Work
from app.models.order import Order, OrderStatus from app.models.order import Order, OrderStatus
@@ -15,6 +16,23 @@ from app.schemas.work import WorkResponse, WorkListResponse
router = APIRouter(prefix="/works", tags=["作品"]) router = APIRouter(prefix="/works", tags=["作品"])
def resolve_upload_file_path(image_path: str) -> str:
"""兼容 /uploads 相对路径和完整 URL 两种历史存储格式。"""
if not image_path:
return ""
normalized = image_path.strip()
if normalized.startswith(("http://", "https://")):
normalized = urlparse(normalized).path or ""
normalized = normalized.lstrip("/")
if normalized.startswith("uploads/"):
normalized = normalized[len("uploads/"):]
return os.path.join(settings.UPLOAD_DIR, normalized)
@router.get("", response_model=WorkListResponse, summary="获取作品列表") @router.get("", response_model=WorkListResponse, summary="获取作品列表")
def get_works( def get_works(
page: int = Query(1, ge=1), page: int = Query(1, ge=1),
@@ -139,10 +157,7 @@ def download_work(
) )
# 构建原图文件路径 # 构建原图文件路径
relative_path = work.original_image.lstrip("/") full_path = resolve_upload_file_path(work.original_image)
if relative_path.startswith("uploads/"):
relative_path = relative_path[len("uploads/"):]
full_path = os.path.join(settings.UPLOAD_DIR, relative_path)
# 检查文件是否存在 # 检查文件是否存在
if not os.path.exists(full_path): if not os.path.exists(full_path):