正则表达式检测文件类型是否为视频或图片

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) {
  // 处理视频文件
}
相关推荐
小博士爱吃西红柿3 分钟前
grok-video-3 视频生成 API 对接配置教程
音视频
SuperEugene5 分钟前
Vue3 + Vue Router + Pinia 路由守卫规范:beforeEach 应做 / 不应做,避死循环、防重复请求|状态管理与路由规范篇
开发语言·前端·javascript·vue.js·前端框架
东东__net10 分钟前
js逆向与谷歌加密库
开发语言·前端·javascript
m0_5027249519 分钟前
腾讯地图tlbs-multi-marker动态更新marker图标
前端·javascript·vue.js·地图
Alan Lu Pop38 分钟前
React 表单提交关键词意外触发刷新
前端·javascript·react.js
我命由我1234541 分钟前
React - 创建 React 项目、React 项目结构、React 简单案例、TodoList 案例
前端·javascript·react.js·前端框架·ecmascript·html5·js
SuperEugene43 分钟前
Vue3 Pinia 状态管理规范:何时用 Pinia 何时用本地状态|状态管理与路由规范篇
开发语言·前端·javascript·vue.js·前端框架
Moment44 分钟前
TypeScript 要换芯了,6.0 竟是旧编译器的最后一舞
前端·javascript·github
无巧不成书02181 小时前
【开源AI视频笔记工具】BiliNote部署教程:本地+Docker双方案,小白也能轻松上手!
人工智能·开源·音视频·bilinote部署教程·cookie获取
Ronin3051 小时前
【Qt系统相关】Qt系统相关
网络·qt·音视频·多线程·定时器·事件·qt文件