import request from '@/utils/request' const signedUrlCache = new Map() /** * 判断是否为腾讯云COS私有存储预签名地址 */ export function isCosUrl(url) { if (!url || typeof url !== 'string') { return false } return url.includes('.myqcloud.com/') || url.includes('.cos.') } /** * 去除URL里预签名query参数,返回原始文件地址 */ export function stripSignedParams(url) { if (!url) { return url } const index = url.indexOf('?') return index > 0 ? url.substring(0, index) : url } /** * 转换存储地址为可访问链接,私有文件自动获取预签名地址 */ export function resolveAccessUrl(url) { const storedUrl = stripSignedParams(url) if (!storedUrl || !isCosUrl(storedUrl)) { return Promise.resolve(url) } if (signedUrlCache.has(storedUrl)) { return Promise.resolve(signedUrlCache.get(storedUrl)) } return request({ url: '/common/getSignedUrl', method: 'get', params: { url: storedUrl } }).then(res => { const accessUrl = (res.accessUrl || res.url || storedUrl) signedUrlCache.set(storedUrl, accessUrl) return accessUrl }).catch(() => storedUrl) } /** * 批量转换COS文件访问URL */ export function resolveAccessUrls(urls) { if (!urls || !urls.length) { return Promise.resolve([]) } return Promise.all(urls.map(url => resolveAccessUrl(url))) }