javascript
// 配置化文件类型检测(集中管理支持的类型)
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);
添加文件大小限制
javascript
function validateFileSize(file: File, maxSizeMB: number): boolean {
return file.size <= maxSizeMB * 1024 * 1024;
}
添加白名单域名验证(防止恶意文件)
javascript
//添加白名单域名验证(防止恶意文件)
function validateFileOrigin(url: string, allowedDomains: string[]): boolean {
try {
const { hostname } = new URL(url);
return allowedDomains.includes(hostname);
} catch {
return false;
}
}
使用示例
javascript
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) {
// 处理视频文件
}