修复验收图片多选暂存
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
import type { UploadedFile } from '@/types/worker-platform'
|
||||
|
||||
/**
|
||||
* 归一化图片身份标识,用于跨来源去重(files 与 imageUrls 可能同时包含同一张图)。
|
||||
*
|
||||
* 本项目的图片地址有两种形态:
|
||||
* - 对象存储签名链接:`/api/v1/files/object?key=<objectKey>&expires=...&signature=...`
|
||||
* (对象 key 在 query 里,路径对所有文件相同,不能只取路径)
|
||||
* - 普通外链:`https://cdn.example.com/a.png`
|
||||
*
|
||||
* 优先级:objectKey 字段 > URL 中的 key 参数 > 去掉临时签名参数后的完整地址。
|
||||
*/
|
||||
export function getImageIdentity(file: {
|
||||
objectKey?: string
|
||||
url?: string
|
||||
mediumUrl?: string
|
||||
thumbnailUrl?: string
|
||||
}): string {
|
||||
const objectKey = String(file?.objectKey || '').trim()
|
||||
if (objectKey) return objectKey
|
||||
const url = String(
|
||||
file?.url || file?.mediumUrl || file?.thumbnailUrl || '',
|
||||
).trim()
|
||||
return getImageIdentityFromUrl(url)
|
||||
}
|
||||
|
||||
export function getImageIdentityFromUrl(value: string): string {
|
||||
const url = String(value || '').trim()
|
||||
if (!url) return ''
|
||||
const keyMatch = url.match(/[?&]key=([^&#]+)/)
|
||||
if (keyMatch?.[1]) {
|
||||
try {
|
||||
return decodeURIComponent(keyMatch[1])
|
||||
} catch {
|
||||
return keyMatch[1]
|
||||
}
|
||||
}
|
||||
// 普通地址:仅去掉临时签名参数(expires/signature),保留路径与其它参数
|
||||
return url
|
||||
.split('#', 1)[0]
|
||||
.replace(/[?&](expires|signature)=[^&#]*/gi, '')
|
||||
.replace(/[?&]+$/, '')
|
||||
}
|
||||
|
||||
/** 供 UploadedFile 数组去重:按图片身份去重,保留第一张 */
|
||||
export function uniqueUploadedFiles(files: UploadedFile[]): UploadedFile[] {
|
||||
const seen = new Set<string>()
|
||||
return files.filter((file) => {
|
||||
const identity = getImageIdentity(file)
|
||||
if (!identity || seen.has(identity)) return false
|
||||
seen.add(identity)
|
||||
return true
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user