liu
2026-09-30 71beff1699701e18c2503791c7ba1437c89966aa
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
39
40
41
42
/**
 * 修正后端返回的附件访问地址
 *
 * 后端生成 url / previewURL / downloadURL 时会带上它自己配置的访问域名
 * (当前后端配的是 192.168.1.6:48080)。只要该域名与前端不同源、或者该主机
 * 在当前网络里不可达,`<img src>` 就会直接加载失败,页面上表现为「图片不显示」。
 *
 * 这里把这类绝对地址改写成相对 API 前缀的路径,让它走当前站点的同源请求:
 * 开发环境经 vite 的 /admin-api 代理转发到后端,生产环境前后端同源时同样成立。
 *
 * 已经是相对路径、同源地址,以及 data:/blob: 一律原样返回。
 */
export function toAccessibleFileUrl(raw?: string): string {
  if (!raw) {
    return '';
  }
  // 相对地址、data:、blob: 直接放行
  if (!/^https?:\/\//i.test(raw)) {
    return raw;
  }
  try {
    const url = new URL(raw);
    // 本来就同源,无需处理
    if (url.origin === window.location.origin) {
      return raw;
    }
    const apiPrefix = (import.meta.env.VITE_GLOB_API_URL || '/admin-api').replace(
      /\/+$/,
      '',
    );
    // 命中 API 前缀时,截取前缀及其之后的路径与查询串
    const at = url.pathname.indexOf(`${apiPrefix}/`);
    if (at >= 0) {
      return `${url.pathname.slice(at)}${url.search}`;
    }
    // 不是文件接口的地址,不做处理
    return raw;
  } catch {
    // URL 解析失败时保持原值,避免把可用地址改坏
    return raw;
  }
}