当前位置: 首页 > news >正文

检测无后缀名的文件类型

前言

一般情况下我们判断一个文件是什么类型都是通过看它的后缀名,例如 xx.mp3 xx.mp4 xx.jpg,但是这并不准确!
假如我把 xx.wav 文件的后缀手动改成了 .mp3 ,但它的文件类型依旧是 wav,因为计算机是通过读取文件二进制的前几个字节来区分文件类型,
对于大多数类型的文件,起始字节都是固定的,这些字节通常被称为 “魔数” (Magic Number)

常见文件的“魔数”

  1. JPEG 图片:FF D8 FF DB | 49 46 00 01
  2. PNG 图片:89 50 4E 47 0D 0A 1A 0A
  3. MP3 音频:49 44 33 | FF FB | FF F3 | FF F2
  4. MP4 视频:66 74 79 70 69 73 6F 6D

更多请参考 维基百科 - List of file signatures

读取文件二进制数据

const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = (e) => {
  // 这里就拿到了文件的二进制数据
  const arrBuffer = e.target.result as ArrayBuffer;
};
reader.onerror = (err) => {
  throw new Error(err);
};

二进制数组 转 16 进制字符串

这里有个需要注意的地方,如果文件太大了,导致二进制数组长度超过 2^32,
使用 Array.form 方法转换时候会报错 invalid array length
详情可参考:MDN - invalid array length

function bufferToString(buffer: ArrayBuffer) {
  const uint8Array = new Uint8Array(buffer, 0, Math.pow(2, 16));
  return Array.from(uint8Array)
    .map((byte) => byte.toString(16).padStart(2, "0"))
    .join("");
}

类型判断

最后通过正则去匹配字符串开头是否包含对于文件的“魔数”。

const Mp3MagicNum = ["494433", "FFE2", "FFE3", "FFF2", "FFF3", "FFFA", "FFFB"];

function isMp3Type(hex: string) {
  for (let key of this.Mp3MagicNum) {
    if (new RegExp("^" + key, "i").test(hex)) return true;
  }
  return false;
}

const hex = bufferToString(arrBuffer);
const isMp3 = isMp3Type(hex);

相关文章:

  • 《筋斗云的K8s容器化迁移》
  • Linux孤儿进程和僵尸进程
  • 谈谈常见的数据结构(如数组、链表、栈、队列、哈希表、树、图)及其应用场景
  • OpenHarmony v4.1 Release设置应用随系统自动启动
  • Sa-Token核心功能解剖三(OAuth2.0认证、分布式会话、参数签名 )
  • Transformers without Normalization paper笔记
  • Android OpenGLES 360全景图片渲染(球体内部)
  • wsl2的centos7安装jdk17、maven
  • 欧拉公式和sin cos
  • 3.31Python有关文件操作
  • 【java】Java核心知识点与相应面试技巧(九)——异常
  • PHP回调后门
  • Ubuntu22.04系统离线部署Maxkb【教程】
  • 再见VS Code!Google IDE 正颠覆传统开发体验
  • 探秘中医五色五味:开启饮食养生新智慧
  • Element ui input组件类型为 textarea 时没有 清空按钮
  • [网络_1] 因特网 | 三种交换 | 拥塞 | 差错 | 流量控制
  • Nordic 新一代无线 SoC nRF54L系列介绍
  • Tiny Lexer 一个极简的C语言词法分析器
  • 回溯(子集型):分割回文串
  • 深圳外网站建设/最新新闻国内大事件
  • 字画价格网站建设方案/数据统计网站有哪些
  • 建湖建网站的公司/拉新十大推广app平台
  • 公司网站设计欣赏/安徽seo报价
  • 上海门户网站制/数据分析师报考官网
  • 长沙网站制作哪/网上教育培训机构