編寫接口的時候經常需要將上傳的文件保存到數據庫的情況,在nodejs中文件上傳可以使用multer來接收上傳的文件。如果不想保存到本地,而是直接保存到mongodb中,就要將buffer對象轉化成流再寫入數據庫。
雖然fs模塊的接口文檔中說該模塊可以接收Buffer對象作為參數,但實踐中發現傳入buffer對象會報錯:
var fs = require('fs');
var b = Buffer([80,80,80,80]);
var readStream = fs.createReadStream(b);
console.log(readStream);
// ReadStream {
// ...
// path: <Buffer 50 50 50 50>,
// ...
// }
//
// Error: ENOENT: no such file or directory, open 'PPPP'
根據
https://stackoverflow.com/questions/45891242/how-to-pass-a-buffer-as-argument-of-fs-createreadstream/45891702#45891702
的回答,fs的內部是調用open()函數,所以實際上只能接收文件路徑,並不能使用buffer對象作為參數。
為了實現這個目的,就要將Buffer對象轉化成stream,這列可以使用一個stream模塊:
var stream = require('stream');
// 創建一個bufferstream
var bufferStream = new stream.PassThrough();
//將Buffer寫入
bufferStream.end(new Buffer('Test data.'));
//進一步使用
bufferStream.pipe(process.stdout)
這樣就可以將buffer轉化成stream。
參考https://stackoverflow.com/questions/16038705/how-to-wrap-a-buffer-as-a-stream2-readable-stream