Ruby(RestClient)向Node.js传图片后使用image-size报错求助
解决Ruby发送图片到Node.js后image-size报错的问题
我来帮你搞定这个报错!你遇到的TypeError: unsupported file type: undefined本质是Node端拿到的buffer不是有效的图片二进制数据,大概率是请求发送或接收的环节出了问题,咱们一步步排查修复:
先分析可能的问题点
这个错误说明image-size无法识别传入的buffer,要么buffer是空的,要么已经被损坏,常见原因有两个:
- Ruby端的请求构造不对,没有正确发送图片二进制
- 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端口运行'));
排查验证步骤
如果还是报错,你可以按以下步骤确认:
- 检查Ruby端的payload:把payload写入本地文件(
File.write('test.png', payload)),打开看看是否是正常图片,确认数据没损坏。 - 检查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 ...>
如果魔数不对,说明传输过程中数据被篡改了。
- PNG的魔数:
内容的提问来源于stack exchange,提问作者Juriy
相关产品推荐
相关产品推荐

