Node.js二进制HTTP流

6
我可以帮您进行翻译。以下是翻译的结果:

我需要从客户端(nodejs命令行)和服务器(express nodejs)流传输文件。

这是客户端代码:

var request = require('request');
var fs = require('fs');

// ...

  var readStream = fs.createReadStream(file.path);
  readStream.on('end', function() {
    that.emit('finished');
  });
  readStream.pipe(request.post(target));

// ...

这是服务器端:
var fs = require('fs');
var path = require('path');

// ...

    app.post('/:filename', function(req, res) {
      req.setEncoding('binary');
      var filename = path.basename(req.params.filename);
      filename = path.resolve(destinationDir, filename);
      var dst = fs.createWriteStream(filename);
      req.pipe(dst);
      req.on('end', function() {
        res.send(200);
      });
    });

// ...

一切正常,文件在服务器端正确保存...但它们的大小比源文件大约50%。我试图用hexdump比较这两个文件的差异,发现服务器端的文件有时包含类似内容但具有0xC2的编码问题。我猜测这与编码有关。

1
为什么要设置编码?这将将每个块转换为字符串,主要是为了从流中读取字符串。由于您直接将请求管道传输到文件,我认为您不应该调用setEncoding - Paul Mougel
尝试使用 fs.createWriteStream(filename, {encoding: 'binary'}) - levi
fs.createWriteStream(filename, {encoding: 'binary'}) 没有起作用。Node API:编码可以是'utf8'、'ascii'或'base64'。 - Alessandro Pezzato
1
移除 req.setEncoding('binary'); 就是解决方案。奇怪...当它不起作用时我添加了它。 - Alessandro Pezzato
好的,知道了!我会将这个作为答案添加,这样解决方案就更容易找到了。 - Paul Mougel
1个回答

3
不要调用req.setEncoding('binary')
这会将每个块都转换为字符串,主要是为了从流中读取字符串。由于您直接将请求管道传输到文件中,因此不需要这样做。

还值得一提的是,binary编码已经被弃用。 - vkurchatkin
文档中没有提到这一点。源代码提到了“向后兼容”,但没有提到弃用。你有链接吗? - Paul Mougel
这个问题指的是这个问题,看起来binary不会很快消失... - Paul Mougel
我认为大家可以看出 binary 有点过时了,但并不是特别过时。无论如何,在新代码中使用它都不是一个好主意。 - vkurchatkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接