如何在 Node.js 应用中集成 Magika JS 包识别 Buffer 的文件内容类型
2026/9/14 14:48:08 网站建设 项目流程

如何在 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 magika

magika包(当前 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),BufferUint8ArrayUint16Array三种格式都接受;
  • magika.load()不传参数时,模型与配置从 GitHub 上托管的地址加载,默认地址定义在 js/magika.ts 的MODEL_URLCONFIG_URLhttps://google.github.io/magika/model/model.jsonhttps://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,包含modelURLmodelPathconfigURLconfigPath四个可选字段。

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:除labelscore外,还包含各内容类型与对应分数的列表(见 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。测试断言同一路径下identifyStreamidentifyBytes返回相同 label,两条路径结果一致。

验证结果是否正确

仓库自带测试文件目录 tests_data,可用于手工核对。以 tests_data/basic/markdown/magika_test.md 为例,把主路径代码中的文件换成它,期望prediction.labelmarkdown。测试 js/test/magika.test.ts 的判定逻辑与此一致:递归扫描tests_data/basictests_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 中的说明)。
  • 测试目前跳过dockerfiletomltypescriptyara四类,测试代码注释说明原因是“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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询