topfans/frontend/utils/assetImageHelper.js
2026-05-17 19:03:34 +08:00

128 lines
3.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { getOssPresignedUrlApi } from '@/utils/api.js'
/**
* 从URL提取文件名
* @param {String} url - URL字符串
* @returns {String|null} 提取的文件名失败返回null
*/
export function extractFileNameFromUrl(url) {
if (!url || url.startsWith('/static/')) {
return null;
}
try {
let urlPath = url;
// 如果是完整URL提取路径部分
if (url.includes('://')) {
// 找到协议后的第一个 / 开始的路径
const protocolEndIndex = url.indexOf('://');
const pathStartIndex = url.indexOf('/', protocolEndIndex + 3);
if (pathStartIndex !== -1) {
urlPath = url.substring(pathStartIndex);
}
}
// 提取最后一个 / 之后的内容作为文件名
const fileName = urlPath.substring(urlPath.lastIndexOf('/') + 1);
return fileName || null;
} catch (error) {
console.error('提取文件名失败:', error);
return null;
}
}
/**
* 从cover_url提取文件名兼容旧函数名
* @param {String} coverUrl - 后端返回的cover_url
* @returns {String|null} 提取的文件名失败返回null
*/
export function extractFileNameFromCoverUrl(coverUrl) {
return extractFileNameFromUrl(coverUrl);
}
/**
* 从OSS完整URL中提取对象路径保留bucket之后的完整路径
* 例如https://bucket.oss-cn-shanghai.aliyuncs.com/asset/13/87/file.jpg -> asset/13/87/file.jpg
* @param {String} url - OSS完整URL
* @returns {String|null} 对象路径失败返回null
*/
export function extractOssObjectPath(url) {
if (!url || url.startsWith('/static/')) return null;
try {
if (url.includes('aliyuncs.com/')) {
return url.substring(url.indexOf('aliyuncs.com/') + 'aliyuncs.com/'.length);
}
// 兜底:返回域名后的路径
const protocolEnd = url.indexOf('://');
const pathStart = url.indexOf('/', protocolEnd + 3);
if (pathStart !== -1) {
return url.substring(pathStart + 1);
}
return null;
} catch (e) {
return null;
}
}
/**
* 获取藏品封面的真实URL - 使用 OSS 预签名 URL
* @param {String} coverUrl - 后端返回的cover_url相对路径或完整URL
* @returns {Promise<String>} 真实可访问的URL
*/
export async function getAssetCoverRealUrl(coverUrl) {
// 默认图片路径
const DEFAULT_IMAGE = '/static/nft/collection.png';
// 如果是本地静态资源或为空,直接返回
if (!coverUrl || coverUrl.startsWith('/static/')) {
return coverUrl || DEFAULT_IMAGE;
}
// 如果是完整的绝对URL包含 ://),直接返回
if (coverUrl.includes('://')) {
return coverUrl;
}
// 相对路径调用预签名接口获取可访问的URL
try {
const res = await getOssPresignedUrlApi(coverUrl, 3600, 'asset');
if (res && res.data && res.data.url) {
return res.data.url;
}
return coverUrl;
} catch (e) {
console.error('[assetImageHelper] get presigned url failed:', e);
return coverUrl;
}
}
/**
* 获取好友头像的真实URL - 使用 OSS 预签名 URL
* @param {String} avatarUrl - 后端返回的avatar_url
* @returns {Promise<String>} 真实可访问的URL失败返回空字符串
*/
export async function getFriendAvatarRealUrl(avatarUrl) {
// 如果是本地静态资源或为空,直接返回
if (!avatarUrl || avatarUrl.startsWith('/static/')) {
return avatarUrl || '';
}
// 如果是完整的绝对URL包含 :://),直接返回
if (avatarUrl.includes('://')) {
return avatarUrl;
}
// 相对路径调用预签名接口获取可访问的URL
try {
const res = await getOssPresignedUrlApi(avatarUrl, 3600, 'avatar');
if (res && res.data && res.data.url) {
return res.data.url;
}
// 预签名失败,返回原始路径
return avatarUrl;
} catch (e) {
console.error('[assetImageHelper] get avatar presigned url failed:', e);
return avatarUrl;
}
}