2

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

  1. 从 API 提供给我的 URL 中检索图像 (jpeg) 的原始数据
  2. 将原始数据或缓冲区传递给将其上传到另一台服务器的函数
  3. 永远不要将映像通过管道传输到磁盘

我已经按照我能找到的每个示例(不通过管道传输到磁盘),但内容仍然损坏。我曾尝试强制执行各种“接受编码”(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);
  });              
});
4

1 回答 1

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()创建单个缓冲区。这种方式更好,因为您最初将图像的数据附加到字符串上,这可能会导致损坏。

于 2013-09-24T01:22:11.407 回答