// 配置化文件類型檢測(集中管理支持的類型)
const FILE_TYPE_CONFIG = {video: {extensions: ['mp4', 'webm', 'ogg', 'quicktime'], // 可擴展支持更多格式regex: /^video\/(mp4|webm|ogg|quicktime)$/i // 自動生成正則},image: {extensions: ['jpeg', 'jpg', 'png', 'webp', 'gif', 'svg+xml'], // 包含SVG支持regex: /^image\/(jpeg|jpg|png|webp|gif|svg\+xml)$/i}
};function detectFileType(type: string): {isVideo: boolean;isImage: boolean;extension: string | null;
} {// 統一處理MIME類型const normalizedType = type.toLowerCase();// 視頻檢測const isVideo = FILE_TYPE_CONFIG.video.regex.test(normalizedType);// 圖片檢測const isImage = FILE_TYPE_CONFIG.image.regex.test(normalizedType);// 提取擴展名(可選功能)const extension = FILE_TYPE_CONFIG.image.extensions.find(ext => normalizedType.includes(ext)) || FILE_TYPE_CONFIG.video.extensions.find(ext => normalizedType.includes(ext)) || null;return { isVideo, isImage, extension };
}// 使用示例
const { type } = file;
const { isVideo, isImage } = detectFileType(type);
添加文件大小限制
function validateFileSize(file: File, maxSizeMB: number): boolean {return file.size <= maxSizeMB * 1024 * 1024;
}
添加白名單域名驗證(防止惡意文件)
//添加白名單域名驗證(防止惡意文件)
function validateFileOrigin(url: string, allowedDomains: string[]): boolean {try {const { hostname } = new URL(url);return allowedDomains.includes(hostname);} catch {return false;}
}
?使用示例
const { type, size} = file;// 基礎檢測
const { isVideo, isImage } = detectFileType(type);// 高級驗證
const isSafe = validateFileOrigin(url, ['cdn.example.com']);
const isSizeValid = validateFileSize(file, 10); // 10MB限制// 完整檢測流程
if (isImage && isSafe && isSizeValid) {// 處理圖片文件
} else if (isVideo) {// 處理視頻文件
}