如何在Node.js中将二进制缓冲区解码为图像?

5

我正在接收二进制流中的图像,如下所示,但是当我尝试使用以下数据创建缓冲区时,缓冲区似乎是空的。问题是缓冲区不理解这种格式吗?

V�q)�EB\u001599!F":"����\u000b��3��5%�L�\u0018��pO^::�~��m�<\u001e��L��k�%G�$b\u0003\u0011���=q�V=��A\u0018��O��U���m�B���\u00038�����0a�_��#\u001b����\f��(�3�\u0003���nGjr���Mt\�\u0014g����~�#�Q�� g�K��s��@C��\u001cS�`\u000bps�Gnzq�Rg�\fu���C\u0015�\u001d3�E.BI\u0007���

var buffer = new Buffer(req.body, 'binary')
    console.log("BUFFER:" + buffer)
fs.writeFile('test.jpg', buffer, function(err,written){
   if(err) console.log(err);
    else {
     console.log("Successfully written");
    }
});
2个回答

1

我认为你在调用fs.writeFile时应该设置编码方式,像这样:

fs.writeFile('test.jpg', buffer, 'binary', function(err) {

问题发生在我所认为的之前。当我记录“buffer”时,它是空的,并且“buffer.length”也返回0。 - Sarodh Uggalla
那么可能是req.body为空? - berthni
我从 logging out req.body 直接复制了引号中的内容。 - Sarodh Uggalla
你检查了缓冲区的字节长度吗? - Jason Livesay

1
问题是body-parser无法解析内容类型为octet-stream的请求,而我在覆盖头部将其解析为url-encoded-form时,缓冲区并不能理解它,尽管我能够记录req.body。下面的中间件允许body-parser解析内容类型为octet-stream的请求。
app.use(function(req, res, next) {
   var contentType = req.headers['content-type'] || ''
   var mime = contentType.split(';')[0];
    // Only use this middleware for content-type: application/octet-stream
    if(mime != 'application/octet-stream') {
        return next();
    }
   var data = '';
   req.setEncoding('binary');
    req.on('data', function(chunk) { 
       data += chunk;
   });
   req.on('end', function() {
      req.rawBody = data;
      next();
  });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接