我正在尝试制作图片上传服务。我目前正在发送数据,将其存储在一个数组中,然后使用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', {
})
})
如果有人能提供帮助,我们将不胜感激。
答案 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);
})
});