簡體   English   中英

將流轉換為緩沖區?

[英]Convert stream into buffer?

如何在nodejs中將流轉換為緩沖區? 這是我在快遞中的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!');
  });
});

您可以將dataend事件處理程序附加到part流以讀取它,而不是管道:

var buffers = [];
part.on('data', function(buffer) {
  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...
  });
});

但是,這讀取整個上傳到內存中。 如果這是一個問題,您可能需要考慮創建自定義轉換流來轉換傳入數據,但這可能不是一件容易的事。

您可以使用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自己實現邏輯。 作為可寫流實現器,您只需要定義一個函數: _write方法 ,每次將某些數據寫入流時都會調用該函數。 當輸入流完成發出數據時,將發出end事件 :然后我們將使用Buffer.concat方法創建一個緩沖區。

var stream = require('stream');
var converter = new stream.Writable();
converter.data = []; // We'll store all the data inside this array
converter._write = function (chunk) {
  this.data.push(chunk);
};
converter.on('end', function() { // Will be emitted when the input stream has ended, ie. no more data will be provided
  var b = Buffer.concat(this.data); // Create a buffer from all the received chunks
  // Insert your business logic here
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM