新闻详情

新闻详情

首页 / 资讯中心 / 详情

用 Node.js 给 PNG 商品图做一道文件检查

发布时间:2026/9/28 20:56:35来源:尧图网络
用 Node.js 给 PNG 商品图做一道文件检查
图片制作完成以后运营仍可能收到尺寸过小、体积过大甚至扩展名与内容不相符的文件。本文实现一道本地 PNG 预检读取文件签名和 IHDR 宽高按项目配置输出告警不修改原图不上传图片。它适合接在素材导出之后。例如从 Picset 或其他图像工具导出的文件可以先进入这道检查这不需要假设这些工具提供 API也不是对其输出质量的评价。[1] JPEG、WebP 等格式不在这段代码的识别范围内。先划清这段检查的边界PNG 以固定签名开始首个数据块为 IHDR其中包含宽、高等信息。[2] 根据这些字段可以判断基本头部是否符合预期以及尺寸是否达到当前配置。但读取头部不等于成功解码。下面代码不校验所有数据块的 CRC也不检查图像数据是否完整所以不应把返回结果命名为“图片安全”或“可上架”。输出只说明这一轮文件预检看到了什么。图像真正打开后的内容、商品准确性和目标平台要求还需要其他检查。读取有限字节不把大文件全部装进内存代码使用 Node.js 内置模块只读取前面一小段头部。下面的尺寸与体积阈值均为演示配置不是任何电商平台的统一要求。正式使用时应按真实版位填写。const fs require(‘node:fs/promises’);const path require(‘node:path’);const SIGNATURE Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);const rules { minWidth: 1200, minHeight: 1200,maxBytes: 5 * 1024 * 1024 };function inspectHeader(head, bytes, config) {if (head.length 33) throw new Error(‘PNG 头部不足’);if (!head.subarray(0, 8).equals(SIGNATURE))throw new Error(‘文件签名不是 PNG’);if (head.readUInt32BE(8) ! 13 ||head.toString(‘ascii’, 12, 16) ! ‘IHDR’)throw new Error(‘首个块不是预期的 IHDR’);const width head.readUInt32BE(16);const height head.readUInt32BE(20);if (!width || !height || width 0x7fffffff ||height 0x7fffffff) throw new Error(‘宽高超出 PNG 范围’);const warnings [];if (width config.minWidth || height config.minHeight)warnings.push(‘宽高低于项目阈值’);if (bytes config.maxBytes) warnings.push(‘体积超过项目阈值’);return { width, height, bytes, warnings };}async function inspectFile(file) {const handle await fs.open(file, ‘r’);try {const stat await handle.stat();if (!stat.isFile()) throw new Error(‘不是普通文件’);const head Buffer.alloc(33);const { bytesRead } await handle.read(head, 0, 33, 0);return inspectHeader(head.subarray(0, bytesRead), stat.size, rules);} finally { await handle.close(); }}async function scan(dir) {const entries await fs.readdir(dir, { withFileTypes: true });for (const entry of entries) {if (!entry.isFile() || !/.png$/i.test(entry.name)) continue;try { console.log(JSON.stringify({ file: entry.name,…await inspectFile(path.join(dir, entry.name)) })); }catch (error) { console.log(JSON.stringify({file: entry.name, error: error.message })); }}}module.exports { inspectHeader, inspectFile, scan };if (require.main module)scan(process.argv[2] || ‘.’).catch(e {console.error(e.message); process.exitCode 1;});保存为 png-preflight.cjs执行 node png-preflight.cjs ./images。每个被扫描的文件输出一行 JSON。没有告警意味着“没有违反这份配置”不是达到了全部平台要求不支持的扩展名会被跳过代码也不会递归扫描子目录或跟随目录中的符号链接。让失败路径也能复查测试时不能只用一张正常图片。应包含短文件、改了扩展名的非 PNG、错误 IHDR、零宽高以及尺寸或体积触发告警的输入。文章包附有使用合成头部的单元测试并额外对本批配图运行预检。合成输入只能验证这些分支不能代替完整图像解码测试。这里还有一个业务上的误区为了消除“宽高过小”告警而直接放大图片不会凭空获得原图没有记录的商品细节。程序负责发现配置差距是否补拍、重新导出或者调整版位应由素材用途决定。文件指标与商品信息质量要分开看。线前再给文件记录加上 SKU、用途和版本预检结果才方便回到具体图片。这个小脚本适合承担导出后的第一道筛选不适合单独承担发布审核。参考资料[1] Picset 产品介绍国际站提示升级为 Picell AI本文不涉及其 API。[2] W3CPNG Specification文件结构与 IHDR
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

ax:Kubernetes之上面向智能体的声明式编排层 2026/9/28 21:50:28

ax:Kubernetes之上面向智能体的声明式编排层

1. 项目概述:从“ax”这个极简标题看智能体编排的底层演进逻辑你最近在技术社区、开源项目列表甚至云厂商白皮书中频繁看到一个词——“ax”。它不像Kubernetes那样有明确的logo和文档首页,也不像RAG那样自带功能定义,但它正以一种近乎“空气…

阅读更多 →
从十万星项目拆解AI Agent的工程化核心 2026/9/28 21:49:55

从十万星项目拆解AI Agent的工程化核心

1. 从十万星项目反推:AI Agent 的工程实质这两年 AI Agent 的火爆程度不用我多说了,GitHub 上动不动就冒出一个几万星的项目,从 AutoGPT 到 MetaGPT,再到各类 Memory 层的中间件,代码仓库从零到十万星可能只需要几个月…

阅读更多 →
harness-sdk 实战指南:从初始化到生产加固的完整经验 2026/9/28 21:49:55

harness-sdk 实战指南:从初始化到生产加固的完整经验

第一次在内部会议里听到 harness-sdk 的时候,我脑子里蹦出来的问题是:这到底是一个库,还是一个平台?后来查资料才搞明白,所谓 harness-sdk,是 Harness 软件交付平台面向开发者的官方开发工具包。它不是为了…

阅读更多 →
ax:面向智能体的Kubernetes语义调度抽象层 2026/9/28 21:49:27

ax:面向智能体的Kubernetes语义调度抽象层

1. “ax”不是缩写,而是一个正在成型的系统级抽象层最近在多个技术社区和开源项目讨论中反复看到“ax”这个词——它既不像传统Linux命令那样是某个工具的简写,也不像Kubernetes里的kubectl那样有明确的全称。我最初以为是拼写错误,直到在Kub…

阅读更多 →
LinuxPTP硬件时间戳配置深度指南:网卡、内核与PHY协同调优 2026/9/28 21:48:21

LinuxPTP硬件时间戳配置深度指南:网卡、内核与PHY协同调优

1. 为什么“5分钟搞定”是个误导,但这个配置真值得你花30分钟吃透LinuxPTP、ptp4l、软硬件时间戳——这几个词最近在工业自动化、金融高频交易、5G前传和车载以太网调试场景里出现频率越来越高。我第一次在客户现场看到他们用ptp4l同步PLC和视觉相机时,设…

阅读更多 →
Superpowers:给AI编程代理装上职业素养外挂的技能扩展包 2026/9/28 21:48:00

Superpowers:给AI编程代理装上职业素养外挂的技能扩展包

最近在折腾AI编程辅助工具的路上,我又发现了一个值得好好聊聊的项目:superpowers。如果你已经在用Claude Code、Codex CLI或者Worbuddy这类大模型编程代理,并且觉得"聊天式写代码"已经不够用了,那这个项目大概率能帮到你…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉