38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
|
|
/** 从 URL 中提取文件名 */
|
||
|
|
export const getFileNameFromUrl = (url: string): string => {
|
||
|
|
try {
|
||
|
|
const urlObj = new URL(url)
|
||
|
|
const pathname = urlObj.pathname
|
||
|
|
const fileName = pathname.split('/').pop() || 'unknown'
|
||
|
|
return decodeURIComponent(fileName)
|
||
|
|
} catch {
|
||
|
|
// 如果 URL 解析失败,尝试从字符串中提取
|
||
|
|
const parts = url.split('/')
|
||
|
|
return parts[parts.length - 1] || 'unknown'
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/** 判断是否为图片 */
|
||
|
|
export const isImage = (filename: string): boolean => {
|
||
|
|
const ext = filename.split('.').pop()?.toLowerCase() || ''
|
||
|
|
return ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'].includes(ext)
|
||
|
|
}
|
||
|
|
|
||
|
|
/** 格式化文件大小 */
|
||
|
|
export const formatFileSize = (bytes: number): string => {
|
||
|
|
if (bytes === 0) return '0 B'
|
||
|
|
const k = 1024
|
||
|
|
const sizes = ['B', 'KB', 'MB', 'GB']
|
||
|
|
const i = Math.floor(Math.log(bytes) / Math.log(k))
|
||
|
|
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
|
||
|
|
}
|
||
|
|
|
||
|
|
/** 获取文件图标 */
|
||
|
|
export const getFileIcon = (filename: string): string => {
|
||
|
|
const ext = filename.split('.').pop()?.toLowerCase() || ''
|
||
|
|
if (isImage(ext)) {
|
||
|
|
return 'ep:picture'
|
||
|
|
}
|
||
|
|
return 'ep:document'
|
||
|
|
}
|