Node.js使用probe-image-size获取svg/gif图片信息报ProbeError如何解决
报错原因
- 内置请求逻辑存在缺陷:probe-image-size 自带的 HTTP 请求逻辑未携带合法
User-Agent等头部,很多静态资源服务器会拦截此类无标识请求,返回错误页面而非图片二进制内容,因此无法识别格式。 - 读取内容长度不足:默认仅读取响应前 16KB 内容判断格式,部分 SVG 文件开头存在大量 XML 声明、注释、空行等冗余内容,核心标识
<svg>标签位于 16KB 以外,无法被捕获识别。 - 未处理压缩响应:部分服务器会返回 gzip/deflate 压缩的图片资源,probe 内置逻辑默认不会自动解压压缩内容,拿到的压缩二进制流无法匹配图片格式特征。
- 低版本兼容性问题:5.x 以下的旧版本 probe-image-size 存在已知的 GIF、SVG 格式识别 Bug,也会触发该报错。
修复方案
放弃使用 probe 内置的请求逻辑,自定义发起请求获取图片二进制内容后再传入 probe 解析,可控性更高,可覆盖绝大多数异常场景,具体实现如下:
- 安装依赖:
npm install probe-image-size axios
- 改造后的代码:
const probe = require('probe-image-size'); const axios = require('axios'); const getFileMetaData = async (fileUrl) => { try { // 自定义请求配置,适配各类静态资源服务器规则 const response = await axios.get(fileUrl, { responseType: 'arraybuffer', headers: { // 配置合法UA避免被服务器拦截 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'image/*' }, // 自动解压gzip/deflate压缩内容 decompress: true, // 最多读取256KB内容,覆盖绝大多数SVG冗余开头场景 maxContentLength: 256 * 1024 }); // 将二进制buffer传入probe解析 return await probe(response.data); } catch (err) { // SVG场景兜底:probe识别失败时自行解析SVG属性提取尺寸 if (fileUrl.toLowerCase().endsWith('.svg')) { const svgContent = response.data.toString('utf8'); const widthMatch = svgContent.match(/<svg[^>]*width\s*=\s*["'](\d+(?:\.\d+)?)(?:px)?["']/i); const heightMatch = svgContent.match(/<svg[^>]*height\s*=\s*["'](\d+(?:\.\d+)?)(?:px)?["']/i); const viewBoxMatch = svgContent.match(/<svg[^>]*viewBox\s*=\s*["']\d+\s+\d+\s+(\d+(?:\.\d+)?)\s+(\d+(?:\.\d+)?)["']/i); return { width: widthMatch ? Number(widthMatch[1]) : (viewBoxMatch ? Number(viewBoxMatch[1]) : null), height: heightMatch ? Number(heightMatch[2]) : (viewBoxMatch ? Number(viewBoxMatch[2]) : null), type: 'svg', mime: 'image/svg+xml' }; } throw err; } };
补充说明:如果遇到未定义宽高也无 viewBox 属性的特殊 SVG 文件,兜底逻辑也会返回宽高为 null,该类属于 SVG 本身未明确尺寸,属于正常情况。
内容的提问来源于stack exchange,提问作者Nouman Shah
相关产品推荐
相关产品推荐

