节点:下载jpeg的原始字节,不带管道输出

时间:2013-09-23 23:01:07

标签: image node.js buffer

这是我正在尝试做的事情:

  1. 从API
  2. 给我的URL中检索图像的原始数据(jpeg)
  3. 将原始数据或缓冲区传递给将其上载到其他服务器的函数
  4. 永远不要将图像传递到磁盘
  5. 我已经按照我可以找到的每个示例(没有管道到磁盘),但内容仍然被破坏了。我试过强制各种“接受编码”(gzip,deflate),但它们基本上解析为相同的数据,只是压缩。

    我认为这与响应编码有关,而不是我要求的数据。

    到目前为止,这是代码:

    var parsedUrl = require('url').parse(PATH_TO_IMAGE)
    var params = {     
      hostname: parsedUrl.hostname,
      path: parsedUrl.path,                                                                                                                                                                                        
    }                  
    
    return http.get(params, function(photo_res) {
      var photoData = '';
      res.setEncoding('binary');
    
      photo_res.on('data', function(chunk) {
        photoData += chunk;
      });              
    
      photo_res.on('end', function() {
        // DO STUFF TO UPLOAD IMAGE            
      });              
    
      photo_res.on('error', function(err) {
        console.error('Unable to download photo:', err);
        return done(err);
      });              
    });
    

1 个答案:

答案 0 :(得分:0)

您有一个简单的排版错误,可能导致Node使用不正确的类型解释您的数据流。你的错误就在这一行:

res.setEncoding('binary');

为避免混淆,您应该保留名为res的响应变量,并且由于您的数据是二进制格式,因此最好将其保留为缓冲区。

http.get(options, function(res) {
  var photoData = [];

  res.setEncoding('binary');
  res.on('data', function(chunk) {
    photoData.push(chunk);
  });              

  res.on('end', function() {  
    var photo = Buffer.concat(photoData);       
  });              

  res.on('error', function(err) {
    console.error('Unable to download photo:', err);
  });              
});

在示例中,我将所有数据块存储到一个数组中,然后使用Buffer.concat()创建一个缓冲区。这种方式更好,因为您最初将图像的数据附加到字符串上,这可能会导致损坏。