Co vám zde uniklo, je, že „buffer“ z možnosti „inMemory“ není „buď/nebo“ a neznamená to, že obsah je místo toho držen „V paměti“. Je to ve skutečnosti "kopie" dat, která se také odesílá do dočasného souboru na disku.
Takže opravdu nezáleží na tom, jestli nastavíte "inMemory" nebo ne, protože soubory se budou stále vytvářet (ve výchozím nastavení v /tmp
adresář ), ale tyto se samozřejmě odpojí, když jsou mimo rozsah:
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');
});
});
A samozřejmě jednoduchý test:
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);
});
Alternativně zavolejte middleware v souladu s metodou požadavku a/nebo nastavte onFileUploadComplete()
spíše než iterovat obsah req.files
. Balíček "gridfs=stream" je pravděpodobně nejjednodušší možností, kterou musíte nahrát obsah, a pokus o práci z vyrovnávací paměti, která je kopií, ve skutečnosti nenabídne žádnou skutečnou výhodu, protože náklady na vstup a úložiště budou vždy existovat.