从swift容器下载时文件已损坏

时间:2014-05-10 06:27:35

标签: node.js openstack openstack-swift

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

我使用此代码发出请求(主要受this code启发):

 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);

    });

  });

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

您是否了解可能导致此类损害的原因?字符编码,我必须删除的结束字符,合并数据的错误方法,...

更新

我让它像那样工作:

  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')很快就会被弃用,所以它不是最好的解决方案。

1 个答案:

答案 0 :(得分: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);
    });
});

但是你的回调必须要求一个Buffer而不是一个String。当然,作为二进制数据,它不应该是一个字符串。