File size: 1,046 Bytes
b4f2238
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
"""公共媒体 URL 解析工具。"""

from __future__ import annotations

import logging
from pathlib import Path

from django.conf import settings

logger = logging.getLogger(__name__)


def resolve_media_url(file_path: str) -> str | None:
    """将文件路径转换为媒体 URL。

    支持绝对路径(在 MEDIA_ROOT 下)和相对路径两种输入。

    Args:
        file_path: 文件路径字符串。

    Returns:
        媒体 URL 字符串,或 None(空路径/异常时)。
    """
    if not file_path:
        return None
    try:
        root = Path(settings.MEDIA_ROOT)
        p = Path(file_path)
        if p.is_absolute() and str(p).startswith(str(root)):
            rel = p.relative_to(root)
            return settings.MEDIA_URL + str(rel).replace("\\", "/")
        elif not p.is_absolute():
            return settings.MEDIA_URL + str(file_path).replace("\\", "/")
    except Exception:
        logger.exception("媒体URL解析失败", extra={"file_path": file_path})
        return None
    return None