1

我想从节点中的 swift 容器中获取文件。

我正在使用此代码发出请求(很大程度上受此代码的启发):

 var client = https.request(options, function(res) {
    var buffers = [];
    res.body='';

    res.on('data', function(buffer) {
       buffers.push(buffer);

    });

    res.on('end', function(err){
      res.body = buffers.join('');
      callback && callback(res);

    });

  });

如果下载文本文件,则没有问题,但对于二进制数据,下载的文件与原始文件在一些字节后出现差异(258 与 mp3 文件)。

你知道什么会导致这样的腐败吗?字符编码,我必须删除的结束字符,错误的数据合并方式,......

更新

我让它像这样工作:

  var client = https.request(options, function(res) {
    res.body='';

    res.on('data', function(buffer) {
      res.body+= buffer.toString('binary');
    });

    res.on('end', function(err){
      callback && callback(res);
    });

  });

但是文档中写到 toString('binary') 很快就会被弃用,所以这不是最好的解决方案。

4

1 回答 1

0
  buffers.join('');

是否在数组上加入字符串,这不是您想要的二进制数据。连接缓冲区的正确方法是

  Buffer.concat(buffers);

http://nodejs.org/api/buffer.html#buffer_class_method_buffer_concat_list_totallength

所以你可以这样做

var client = https.request(options, function(res) {
    var buffers=[];

    res.on('data', function(buffer) {
      buffers.push(buffer);
    });

    res.on('end', function(err){
      res.body=Buffer.concat(Buffers);
      callback && callback(res);
    });
});

但是你的回调必须期待一个缓冲区而不是一个字符串。当然,作为二进制数据,它不应该是字符串。

于 2014-05-10T06:31:24.807 回答