你的文件真的“表里如一”吗?用魔法数字揭开真相!

一场“身份错乱”引发的危机

凌晨三点,程序员小林盯着屏幕上的报错信息抓狂——用户上传的“简历.jpg”竟然无法预览,系统提示“文件格式错误”。他反复检查代码,确认只允许图片格式,但问题依旧存在。直到他偶然发现,这个jpg文件扩展名竟是用户手动修改的,实际内容是一份伪装成图片的恶意文档!

这一刻,小林意识到:文件的“扩展名”可能是个谎言,而真相藏在它的“血液”里——魔法数字(Magic Number)。

谁是揭开真相的“鉴谎师”?

npm库file-type,正是专门破解文件“身份谜案”的利器。它不依赖文件扩展名,而是通过读取文件开头的魔法数字(特定字节序列)精准识别二进制文件类型,无论是图片、视频还是音频,都难逃它的“法眼”。

为什么你需要file-type

  1. 打假专家
    阻止用户伪造扩展名上传恶意文件,比如把.exe伪装成.png
  2. 高效灵活
    支持文件路径、数据流(Stream)、Buffer等多种输入源,甚至能从远程URL实时检测。
  3. 轻量精准
    仅需读取文件前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,并且 可能不在所有现代浏览器中可用.

注意事项

  • 非万能钥匙
    专注于二进制格式(如图片、视频),不适用于纯文本(如TXTCSV)。
  • 概率性判断
    检测结果基于统计学,罕见格式可能无法识别。
  • 环境适配
    需项目支持ESM模块,Webpack用户需升级至最新版本。

让文件“坦诚相见”

无论是防御恶意上传、优化资源处理,还是构建更安全的系统,file-type都能成为你代码中的“鉴谎大师”。只需几行代码,让文件的真实身份无处遁形!

🚀 立即体验:

npm install file-type

技术冷知识:为什么叫“魔法数字”?
1970年代,Unix程序员发现用固定字节标识文件类型,像施了魔法一样神奇,于是这个术语流传至今。比如PNG文件的魔法数字是89 50 4E 47 0D 0A 1A 0A(十六进制),对应ASCII字符“‰PNG▬↨”哦!

🔥 关注我的公众号「哈希茶馆」一起交流更多开发技巧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值