You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用image-type校验图片链接报预期Uint8Array/Buffer却得object错误如何解决

问题原因
  • 调用response.read(imageType.minimumBytes)时,若响应流当前可用字节数小于要求的最小字节数,方法会返回null。null的类型判定结果为object,刚好匹配报错中提到的输入类型不符合的问题。
  • 现有代码缺失响应状态校验逻辑,若链接返回4xx/5xx错误,响应体并非图片二进制内容,也会导致读取结果不符合image-type的输入要求。
修复方案

补充字节有效性判断、请求异常处理、响应状态校验逻辑即可解决问题,修改后参考代码如下:

const https = require("https");
const imageType = require("image-type");

const imageModel = require("../models/models.js");

const date = new Date();
const currentDate = date.toLocaleDateString();

const submitLink = async (req, res) => {
  const { url } = req.body;

  https.get(url, (response) => {
    // 校验响应状态码,非成功状态直接终止请求
    if (response.statusCode < 200 || response.statusCode >= 300) {
      response.destroy();
      return res.status(400).send('图片链接无法正常访问');
    }

    const receivedChunks = [];
    response.on('data', (chunk) => {
      receivedChunks.push(chunk);
      const combinedBuffer = Buffer.concat(receivedChunks);
      // 攒够格式判断需要的最小字节后即可终止读取,减少性能消耗
      if (combinedBuffer.length >= imageType.minimumBytes) {
        response.destroy();
        const imageInfo = imageType(combinedBuffer);
        // 校验图片格式是否为允许的jpg/png
        if (!imageInfo || !['jpg', 'png'].includes(imageInfo.ext)) {
          return res.status(400).send('仅支持上传jpg、png格式的图片');
        }
        // 格式校验通过,后续写入数据库、存储资源的逻辑可在此处实现
        console.log('图片格式校验通过', imageInfo);
      }
    });

    // 处理响应流读取错误
    response.on('error', () => {
      res.status(500).send('读取图片资源失败');
    });
  // 处理请求发送阶段的错误,比如链接域名不存在
  }).on('error', () => {
    res.status(400).send('提交的图片链接无效');
  });
};

内容的提问来源于stack exchange,提问作者tanjim anim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:24:04