Bây giờ, những gì bạn đã bỏ lỡ ở đây là "bộ đệm" từ tùy chọn "inMemory" không phải là "hoặc / hoặc" và thay vào đó không có nghĩa là nội dung được giữ "Trong Bộ nhớ". Trên thực tế, nó là một "bản sao" của dữ liệu cũng được gửi đến tệp tạm thời trên đĩa.
Vì vậy, nó thực sự không quan trọng nếu bạn đặt "inMemory" hay không vì các tệp sẽ vẫn được tạo (theo mặc định trong /tmp
thư mục) nhưng tất nhiên những thứ này sẽ hủy liên kết khi nằm ngoài phạm vi:
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');
});
});
Và tất nhiên là một bài kiểm tra đơn giản:
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);
});
Hoặc gọi nội dung trung gian bằng phương thức yêu cầu của bạn và / hoặc thiết lập onFileUploadComplete()
xử lý thay vì lặp lại nội dung của req.files
. Gói "gridfs =stream" có lẽ là tùy chọn đơn giản nhất mà bạn có để tải lên nội dung và cố gắng làm việc từ bộ đệm là bản sao sẽ không thực sự mang lại bất kỳ lợi thế thực sự nào vì chi phí IO và dung lượng lưu trữ luôn ở đó.