如何在 Node.js 应用中集成 Magika JS 包识别 Buffer 的文件内容类型
【免费下载链接】magikaFast and accurate AI powered file content types detection项目地址: https://gitcode.com/GitHub_Trending/ma/magika
如果你的 Node.js 应用里已经拿到一个文件内容的Buffer(例如上传接口读入的文件数据),需要判断它的实际内容类型是 markdown、json、pdf 还是别的,可以把 Magika 的 JS 包(npm 包名magika)集成进项目。magika包在 Node 环境下导出MagikaNode类,调用identifyBytes传入Buffer后,会返回一个包含最高概率标签label和分数score的对象。本文基于仓库中 js/README.md、docs/js.md 和 js/test/magika.test.ts 说明完整的集成与验证路径。
准备:安装 magika 包
在项目中执行:
npm install magikamagika包(当前 js/package.json 中版本为 0.2.14)的@tensorflow/tfjs为正式依赖,@tensorflow/tfjs-node列为可选依赖,Node 端推理运行时由它加载使用 tfjs/node 版本的模型(见 js/magika_node.ts 构造函数中的注释)。
主路径:用 Buffer 识别文件内容类型
最小可用的集成代码来自 js/README.md:
import { readFile } from "fs/promises"; import { MagikaNode as Magika } from "magika"; const data = await readFile("some file"); const magika = new Magika(); await magika.load(); const prediction = await magika.identifyBytes(data); console.log(prediction);其中:
readFile返回的data就是Buffer,这正是identifyBytes的输入类型。Node 版的签名为identifyBytes(fileBytes: Uint16Array | Uint8Array | Buffer)(见 js/magika_node.ts#L98-L101),Buffer、Uint8Array、Uint16Array三种格式都接受;magika.load()不传参数时,模型与配置从 GitHub 上托管的地址加载,默认地址定义在 js/magika.ts 的MODEL_URL与CONFIG_URL(https://google.github.io/magika/model/model.json与https://google.github.io/magika/model/config.json);identifyBytes返回Promise<ModelResult>,即包含 top label 及其 score 的字典(见 docs/js.md)。
如果你不需要读文件,只要把应用里已有的Buffer直接传给identifyBytes即可,例如上传接口中的req.file.buffer。
可选分支:自定义模型与配置来源
MagikaOptions接口定义在 js/src/magikaOptions.ts,包含modelURL、modelPath、configURL、configPath四个可选字段。
Node 版除了支持 URL,还支持从本地文件加载(Node only):
await magika.load({ modelPath: './assets/...', configPath: './assets/...' });URL 方式的对应写法:
await magika.load({ modelURL: "https://...", configURL: "https://...", });浏览器版的Magika类只支持 URL 方式,本地文件路径是 Node 版独有的能力(见 js/README.md “The Node version also allows to load local files”)。如果你部署在无法访问默认 GitHub 地址的环境,可以改成modelPath/configPath指向本地模型文件。
需要全部内容的概率分布而不只是 top label 时,改用identifyBytesFull:
const result = await magika.identifyBytesFull(data);它返回ModelResultLabels:除label和score外,还包含各内容类型与对应分数的列表(见 docs/js.md)。
可选替代路径:不读入内存,用读流识别
MagikaNode还提供identifyStream(stream, length),从ReadStream识别而无需把整个文件留在内存中;length参数是流数据的总长度,文档说明其用途是“找到文件中段而不把文件保持在内存里”。测试代码中展示了典型用法(见 js/test/magika.test.ts):
const streamResult = await magika.identifyStream( fs.createReadStream("tests_data/basic/markdown/magika_test.md"), (await fs.promises.stat("tests_data/basic/markdown/magika_test.md")).size );length通常来自fs.promises.stat(filePath).size。测试断言同一路径下identifyStream与identifyBytes返回相同 label,两条路径结果一致。
验证结果是否正确
仓库自带测试文件目录 tests_data,可用于手工核对。以 tests_data/basic/markdown/magika_test.md 为例,把主路径代码中的文件换成它,期望prediction.label为markdown。测试 js/test/magika.test.ts 的判定逻辑与此一致:递归扫描tests_data/basic与tests_data/mitra,按所在目录名作为期望 label 断言expect(streamResult.label).toBe(label)。
测试中对 score 的判定是范围检查而非固定数值:score应满足>= 0且<= 1(见测试 “scores should be in the expected range”)。注意不要把某次运行的具体 score 当作必须复现的数值。
如果只想快速冒烟验证环境,文档给出全局 CLI 方式:npm install -g magika后执行magika-js <some files>,可加--json-output输出 JSON(见 js/README.md)。该命令会全局安装包并触发默认模型下载,注意其副作用。它适合确认模型加载正常,批量与递归扫描场景文档建议改用官方 Python CLI(pip install magika)。
边界与限制
- Node 端导入
MagikaNode,浏览器端导入Magika,两者不要混用(见 js/magika.ts 与 js/magika_node.ts 中的说明)。 - 测试目前跳过
dockerfile、toml、typescript、yara四类,测试代码注释说明原因是“Magika V2 尚跳过这些类型,暂在测试中排除”(见 js/test/magika.test.ts 的SKIP_FUTURE_CONTENT_TYPES)。用这些类型验证时,不要以测试断言作为期望。 - 需要批量处理或递归搜索文件时,文档建议走 Python 版 CLI 而不是本 JS 包。
更多 API 细节(参数与返回类型)可查阅 docs/js.md。
【免费下载链接】magikaFast and accurate AI powered file content types detection项目地址: https://gitcode.com/GitHub_Trending/ma/magika
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考