/**
|
* 修正后端返回的附件访问地址
|
*
|
* 后端生成 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;
|
}
|
}
|