|
|
@@ -6,16 +6,24 @@ import { Local } from './storage';
|
|
|
/**
|
|
|
* 给文件地址拼接登录用户 token 参数
|
|
|
* 用于 <a href> / window.open / van-image :src / showImagePreview 等无法携带 Authorization 头的直链访问
|
|
|
- * @param url 原始文件地址
|
|
|
- * @returns 拼接 token 后的地址(非 http(s) / 空 / data: / blob: 直接原样返回,避免本地静态资源被污染)
|
|
|
+ * @param url 原始文件地址(http(s) / 相对路径统一拼接,data: / blob: 等特殊协议原样返回)
|
|
|
+ * @returns 拼接 token 后的地址
|
|
|
*/
|
|
|
export function withToken(url?: string | null): string {
|
|
|
if (url === null || url === undefined) return '';
|
|
|
const str = String(url).trim();
|
|
|
if (!str) return str;
|
|
|
- if (str.startsWith('data:') || str.startsWith('blob:') || str.startsWith('about:') || str.startsWith('#')) return str;
|
|
|
- // 仅 http(s) 文件直链需要鉴权,本地静态资源直接返回
|
|
|
- if (!/^https?:\/\//i.test(str)) return str;
|
|
|
+ const lower = str.toLowerCase();
|
|
|
+ if (
|
|
|
+ lower.startsWith('data:') ||
|
|
|
+ lower.startsWith('blob:') ||
|
|
|
+ lower.startsWith('about:') ||
|
|
|
+ lower.startsWith('javascript:') ||
|
|
|
+ lower.startsWith('mailto:') ||
|
|
|
+ lower.startsWith('tel:') ||
|
|
|
+ str.startsWith('#')
|
|
|
+ )
|
|
|
+ return str;
|
|
|
let token = '';
|
|
|
try {
|
|
|
token = Local.get('token') || '';
|
|
|
@@ -59,7 +67,7 @@ export function stripToken(url?: string | null): string {
|
|
|
* @returns 完整的图片URL
|
|
|
*/
|
|
|
export function getImageUrl(url: string): string {
|
|
|
- // 图片是相对路径不需要拼,但文件直链需要拼接登录 token 鉴权
|
|
|
+ // 仪器图/头像等统一拼接登录 token 鉴权(含相对路径)
|
|
|
return withToken(url);
|
|
|
// if (!url) return ''
|
|
|
|
|
|
@@ -99,5 +107,6 @@ export function getResourceUrl(url: string, baseUrlKey: string = 'VITE_IMAGE_BAS
|
|
|
const cleanBaseUrl = baseUrl.replace(/\/$/, '')
|
|
|
const cleanUrl = url.startsWith('/') ? url : `/${url}`
|
|
|
|
|
|
- return `${cleanBaseUrl}${cleanUrl}`
|
|
|
+ // 相对路径也要拼接 token
|
|
|
+ return withToken(`${cleanBaseUrl}${cleanUrl}`)
|
|
|
}
|