Concatting缓冲区返回损坏的图像node.js

时间:2018-01-16 18:35:48

标签: arrays node.js buffer

我正在尝试制作图片上传服务。我目前正在发送数据,将其存储在一个数组中,然后使用concat函数将它们放在一起。然后我试图保存收到的数据(图像)。但是,当您查看输出的图像时,它已损坏。

app.post('/upload', function(req, res) {
var buffers = []
req.on("data", function(chunk) {
    buffers.push(chunk)
})
req.on("end", function() {
    console.log(buffers);
    Buffer.concat(buffers);
    fs.writeFileSync(`/Users/dangray2004/Documents/HTML/Dimg/images/image1.png`, buffers)
})

res.render('upload', {

})
})

如果有人能提供帮助,我们将不胜感激。

2 个答案:

答案 0 :(得分:3)

原始代码不起作用的原因是Buffer.concat()不会修改它作为参数接收的数组。它返回一个新的Buffer,其内容是数组参数成员的串联。现在你的代码在这里:

  Buffer.concat(buffers);

不收集返回的Buffer,并且:

  fs.writeFileSync('filename', buffers)

将原始缓冲区数组的内容写入文件 - 这几乎是你想要的,除了它会在每个成员的数据写入文件时插入一个逗号。这些额外的逗号会破坏图像数据。

要修复,请用收集concat返回的新缓冲区的代码替换这两行,并将其写入文件:

  var buffer = Buffer.concat(buffers);
  fs.writeFileSync('filename', buffer);

或只是:

  fs.writeFileSync('filename', Buffer.concat(buffers));

答案 1 :(得分:0)

你可以尝试这种方法,对我来说效果很好:

app.post('/upload', function(req, res) {
    var buffer = new Buffer('');
    req.on('data', function(chunk) {
      console.log("data chunk: " + chunk.length);
      buffer = Buffer.concat([buffer, chunk]);
    });
    req.on("end", function() {
        console.log("req.end: " + buffer.length);
        fs.writeFileSync("test.png", buffer);
    })
});