一场“身份错乱”引发的危机
凌晨三点,程序员小林盯着屏幕上的报错信息抓狂——用户上传的“简历.jpg”竟然无法预览,系统提示“文件格式错误”。他反复检查代码,确认只允许图片格式,但问题依旧存在。直到他偶然发现,这个jpg
文件扩展名竟是用户手动修改的,实际内容是一份伪装成图片的恶意文档!
这一刻,小林意识到:文件的“扩展名”可能是个谎言,而真相藏在它的“血液”里——魔法数字(Magic Number)。
谁是揭开真相的“鉴谎师”?
npm库file-type
,正是专门破解文件“身份谜案”的利器。它不依赖文件扩展名,而是通过读取文件开头的魔法数字(特定字节序列)精准识别二进制文件类型,无论是图片、视频还是音频,都难逃它的“法眼”。
为什么你需要file-type
?
- 打假专家
阻止用户伪造扩展名上传恶意文件,比如把.exe
伪装成.png
。 - 高效灵活
支持文件路径、数据流(Stream)、Buffer等多种输入源,甚至能从远程URL实时检测。 - 轻量精准
仅需读取文件前4100字节即可快速判断,不浪费系统资源。
三大核心技能,轻松上手
本地文件:一眼看穿
import { fileTypeFromFile } from 'file-type';
const fileInfo = await fileTypeFromFile('伪装成图片的简历.png');
console.log(fileInfo);
// 输出:{ ext: 'docx', mime: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }
网络资源:远程鉴真
import got from 'got';
import { fileTypeFromStream } from 'file-type';
const stream = got.stream('https://可疑链接/头像.jpg');
const type = await fileTypeFromStream(stream);
if (type?.ext !== 'jpg') throw new Error('这不是一张真图片!');
加密文件:边解密边识别
import { fileTypeStream } from 'file-type';
import crypto from 'node:crypto';
// 解密流中实时检测文件类型
const decipherStream = crypto.createDecipheriv(alg, key, iv);
const analyzedStream = await fileTypeStream(decipherStream);
console.log(analyzedStream.fileType);
// 输出真实类型,如 { ext: 'mp4', mime: 'video/mp4' }
兼容性:浏览器环境也可使用
import {fileTypeFromStream} from 'file-type';
const url = 'https://upload.wikimedia.org/wikipedia/en/a/a9/Example.jpg';
const response = await fetch(url);
const fileType = await fileTypeFromStream(response.body);
console.log(fileType);
//=> {ext: 'jpg', mime: 'image/jpeg'}
进阶玩法:防止用户上传非法文件
// 浏览器中检测用户上传的文件
const input = document.querySelector('input[type="file"]');
const file = input.files[0];
const type = await fileTypeFromBlob(file);
if (type?.mime !== 'image/png') alert('请上传真正的PNG图片!');
fileTypeFromBlob
函数这个函数依赖ReadableStreamBYOBReader 它需要 Node.js ≥ 20,并且 可能不在所有现代浏览器中可用.
注意事项
- 非万能钥匙
专注于二进制格式(如图片、视频),不适用于纯文本(如TXT
、CSV
)。 - 概率性判断
检测结果基于统计学,罕见格式可能无法识别。 - 环境适配
需项目支持ESM
模块,Webpack
用户需升级至最新版本。
让文件“坦诚相见”
无论是防御恶意上传、优化资源处理,还是构建更安全的系统,file-type
都能成为你代码中的“鉴谎大师”。只需几行代码,让文件的真实身份无处遁形!
🚀 立即体验:
npm install file-type
技术冷知识:为什么叫“魔法数字”?
1970年代,Unix程序员发现用固定字节标识文件类型,像施了魔法一样神奇,于是这个术语流传至今。比如PNG
文件的魔法数字是89 50 4E 47 0D 0A 1A 0A
(十六进制),对应ASCII字符“‰PNG▬↨”哦!
🔥 关注我的公众号「哈希茶馆」一起交流更多开发技巧