首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否将流转换为缓冲区?

是否将流转换为缓冲区?
EN

Stack Overflow用户
提问于 2013-11-11 20:33:30
回答 2查看 41.8K关注 0票数 35

如何在nodejs中将流转换为buffer?下面是我用express解析post请求中的文件的代码。

app.post('/upload', express.multipart({
defer: true
}), function(req, res) {
req.form.on('part', function(part) {

//Here I want to convert the streaming part into a buffer.
//do something buffer-specific task

  var out = fs.createWriteStream('image/' + part.filename);
  part.pipe(out);
});

req.form.on('close', function() {
    res.send('uploaded!');
  });
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-11 22:54:26

您可以使用stream-to模块,该模块可以将可读数据流的数据转换为数组或缓冲区:

var streamTo = require('stream-to');
req.form.on('part', function (part) {
    streamTo.buffer(part, function (err, buffer) {
        // Insert your business logic here
    });
});

如果您想更好地了解幕后发生的事情,可以使用Writable stream自己实现逻辑。作为一个可写的流实现者,您只需要定义一个函数:_write method,它将在每次向流中写入一些数据时被调用。当输入流完成发送数据时,end event将被发送:然后我们将使用Buffer.concat method创建一个缓冲区。

var stream = require('stream');
var converter = new stream.Writable();

// We'll store all the data inside this array
converter.data = [];
converter._write = function (chunk) {
    converter.data.push(chunk);
};

// Will be emitted when the input stream has ended, 
// i.e. no more data will be provided
converter.on('finish', function() {
    // Create a buffer from all the received chunks
    var b = Buffer.concat(this.data);

    // Insert your business logic here
});
票数 25
EN

Stack Overflow用户

发布于 2013-11-11 22:53:17

您可以将readableend事件处理程序附加到part流以读取它,而不是管道:

var buffers = [];
part.on('readable', function(buffer) {
  for (;;) {
    let buffer = part.read();
    if (!buffer) { break; }
    buffers.push(buffer);
  }
});
part.on('end', function() {
  var buffer = Buffer.concat(buffers);
  ...do your stuff...

  // write to file:
  fs.writeFile('image/' + part.filename, buffer, function(err) {
    // handle error, return response, etc...
  });
});

注意:如果您使用data,它会将整个上传内容读取到内存中。

您还可以创建一个自定义的transform stream来转换传入的数据,但这可能不是一件容易的事情。

票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19906488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档