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

Ruby(RestClient)向Node.js传图片后使用image-size报错求助

解决Ruby发送图片到Node.js后image-size报错的问题

我来帮你搞定这个报错!你遇到的TypeError: unsupported file type: undefined本质是Node端拿到的buffer不是有效的图片二进制数据,大概率是请求发送或接收的环节出了问题,咱们一步步排查修复:

先分析可能的问题点

这个错误说明image-size无法识别传入的buffer,要么buffer是空的,要么已经被损坏,常见原因有两个:

  1. Ruby端的请求构造不对,没有正确发送图片二进制
  2. Node端的接收逻辑错误,没拿到正确的buffer

修复方案分两种上传场景

场景1:直接发送二进制图片(无表单包装)

Ruby客户端代码(RestClient)

要确保用二进制模式读取文件,并且设置正确的Content-Type头:

require 'rest-client'

# 假设tf是你的临时文件对象
payload = File.binread(tf.path) # 必须用binread,不能用read(文本模式会破坏二进制)

response = RestClient.post(
  'http://your-node-server:3000/upload',
  payload,
  { 'Content-Type' => 'image/png' } # 根据图片类型改,比如image/jpeg
)

Node.js服务端代码(Express)

需要用express.raw中间件接收二进制body,不能用默认的json/urlencoded中间件:

const express = require('express');
const sizeOf = require('image-size');
const app = express();

// 配置接收图片类型的raw二进制数据,limit根据你的图片大小调整
app.use(express.raw({ type: 'image/*', limit: '10mb' }));

app.post('/upload', (req, res) => {
  try {
    // req.body就是完整的图片buffer
    const imgDimensions = sizeOf(req.body);
    console.log('图片尺寸:', imgDimensions);
    res.json(imgDimensions);
  } catch (err) {
    console.error('处理失败:', err);
    res.status(400).send('无效的图片文件');
  }
});

app.listen(3000, () => console.log('服务在3000端口运行'));

场景2:用Multipart表单上传(更适合多文件/带其他参数的情况)

Ruby客户端代码

用RestClient的表单上传方式,自动处理multipart格式:

require 'rest-client'

response = RestClient.post(
  'http://your-node-server:3000/upload',
  { file: File.new(tf.path, 'rb') } # 这里的key是"file",要和Node端对应
)

Node.js服务端代码

需要用multer中间件处理multipart表单:

const express = require('express');
const multer = require('multer');
const sizeOf = require('image-size');
const app = express();

// 使用内存存储模式,不需要保存到磁盘
const upload = multer();

// 接收名为"file"的单个文件
app.post('/upload', upload.single('file'), (req, res) => {
  try {
    // req.file.buffer是图片的二进制buffer
    const imgDimensions = sizeOf(req.file.buffer);
    console.log('图片尺寸:', imgDimensions);
    res.json(imgDimensions);
  } catch (err) {
    console.error('处理失败:', err);
    res.status(400).send('无效的图片文件');
  }
});

app.listen(3000, () => console.log('服务在3000端口运行'));

排查验证步骤

如果还是报错,你可以按以下步骤确认:

  1. 检查Ruby端的payload:把payload写入本地文件(File.write('test.png', payload)),打开看看是否是正常图片,确认数据没损坏。
  2. 检查Node端的buffer:在服务端打印buffer的前8个字节(console.log(req.body.slice(0, 8))或console.log(req.file.buffer.slice(0, 8))),对比图片的魔数:
    • PNG的魔数:<Buffer 89 50 4e 47 0d 0a 1a 0a>
    • JPG的魔数:<Buffer ff d8 ff e0 ...>
      如果魔数不对,说明传输过程中数据被篡改了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:42:59