节点:下载没有pipe道输出的jpeg的原始字节

这是我想要做的:

  1. 从API提供给我的URL中检索图像的原始数据(jpeg)
  2. 将原始数据或缓冲区传递给将其上传到另一个服务器的函数
  3. 切勿将图像移动到磁盘上

我已经按照我可以find的每个例子(这不是pipe道到磁盘),但内容仍然损坏。 我试图强制各种“接受编码”(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); }); }); 

你有一个简单的印刷错误,这可能会导致节点解释你的数据streamtypes不正确。 你的错误在这一行:

 res.setEncoding('binary'); 

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

 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()创build一个单独的缓冲区。 这是更好的方式,因为你最初将图像的数据附加到一个string,这可能会导致腐败。