Sekarang, apa yang Anda lewatkan di sini adalah bahwa "penyangga" dari opsi "inMemory" bukan "salah satu/atau" dan tidak berarti bahwa konten tersebut disimpan "Dalam Memori" sebagai gantinya. Ini sebenarnya adalah "salinan" data yang juga dikirim ke file sementara di disk.
Jadi tidak masalah jika Anda menyetel "inMemory" atau tidak karena file akan tetap dibuat (secara default di /tmp
direktori ) tetapi ini tentu saja akan memutuskan tautan saat di luar cakupan:
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');
});
});
Dan tentu saja tes sederhana:
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);
});
Sebagai alternatif, panggil middle-ware sebaris dengan metode permintaan Anda, dan/atau atur onFileUploadComplete()
handler daripada mengulangi konten req.files
. Paket "gridfs=stream" mungkin merupakan opsi paling sederhana yang Anda miliki untuk mengunggah konten dan mencoba bekerja dari buffer yang merupakan salinan tidak akan benar-benar menawarkan keuntungan nyata karena biaya dan penyimpanan IO akan selalu ada.