ここで見逃したのは、「inMemory」オプションの「buffer」が「どちらか/または」ではなく、代わりにコンテンツが「InMemory」に保持されることを意味しないということです。実際には、ディスク上の一時ファイルにも送信されるデータの「コピー」です。
したがって、ファイルは引き続き作成されるため、「inMemory」を設定するかどうかは実際には問題ではありません(デフォルトでは/tmp
にあります)。 ディレクトリ)が、スコープ外の場合はもちろんこれらはリンクを解除します:
var async = require('async'),
express = require('express'),
multer = require('multer'),
fs = require('fs'),
mongoose = require('mongoose'),
Grid = require('gridfs-stream'),
Schema = mongoose.Schema;
Grid.mongo = mongoose.mongo;
var app = express(),
gfs = {};
// Set up multer middleware
app.use(
multer({
//inMemory: true
})
);
// Register handler
app.post('/',function (req,res) {
async.eachLimit(Object.keys(req.files), 10, function(file,callback) {
var fileobj = req.files[file];
var writeStream = gfs.createWriteStream({
"filename": fileobj.fieldname
});
fs.createReadStream(fileobj.path).pipe(writeStream);
writeStream.on('close',function() {
console.log('done');
callback();
});
writeStream.on('error',callback);
},function(err) {
if (err) {
console.log(err);
res.status(500).end();
}
res.status(200).end();
});
});
mongoose.connect('mongodb://localhost/test');
// Start app listen and events
var server = app.listen(3000,function() {
mongoose.connection.on('open',function(err) {
if (err) throw err;
// Set up connection
gfs = Grid(mongoose.connection.db);
console.log('listening and connected');
});
});
そしてもちろん簡単なテスト:
var FormData = require('form-data'),
fs = require('fs'),
http = require('http');
var fname = 'GearsLogo.png';
var form = new FormData();
form.append(fname,fs.createReadStream(fname))
var request = http.request({
method: 'post',
port: 3000,
headers: form.getHeaders()
});
form.pipe(request);
request.on('response',function(res) {
console.log(res.statusCode);
});
または、リクエストメソッドに沿ってミドルウェアをインラインで呼び出すか、onFileUploadComplete()
を設定します。 req.files
のコンテンツを反復するのではなくハンドラー 。 「gridfs=stream」パッケージは、コンテンツをアップロードする必要がある最も簡単なオプションであり、コピーであるバッファーから作業を試みることは、IOコストとストレージが常に存在するため、実際には何の利点も提供しません。