[英]Use Multer in Express Route? (Using MEANJS)
我正在使用Multer在Express 4中上傳圖像。但是,這些示例都顯示Multer在Express文件中被定義為Middleware。 我想在我的應用程序路由本身中實際定義一些Multer行為。 這可能嗎? 我需要的最終結果是我的路由功能在將服務器響應發送到瀏覽器之前識別上傳完成的時間,因此可以向用戶顯示圖像(現在我只顯示部分圖像,因為該文件尚未完成上傳)。
當前的工作代碼
express.js
// Require Multer as module dependency.
var multer = require('multer');
// Using Multer for file uploads.
app.use(multer({
dest: './public/profile/img/',
limits: {
fieldNameSize: 50,
files: 1,
fields: 5,
fileSize: 1024 * 1024
},
rename: function(fieldname, filename) {
return filename;
},
onFileUploadStart: function(file) {
if(file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png') {
return false;
}
}
}));
server_routes.js
app.route('/users/image').post(server_controller_file.imageUpload);
server_controller_file.js
exports.imageUpload = function(req, res) {
// Check to make sure req.files contains a file, mimetypes match, etc., then send appropriate server response.
};
理想情況下,我的server_controller_file.js將包含一些檢查以確保文件完成上傳,例如(注意:這是假設的/可取的,而不是實際的工作代碼)...
var multer = require('multer');
exports.imageUpload = function(req, res) {
multer({
onFileUploadComplete: function(file) {
res.send();
}
});
}
同樣,現在節點的異步性質導致瀏覽器在收到成功響應后認為上傳已完成,因此當我更新URL以顯示圖像時,它僅部分顯示。 謝謝您的幫助!
實際上你可以用另一種方法做你想做的事:
var express = require('express'); var multer = require('multer'); var upload = multer({ dest: './uploads/'}); var app = express(); app.get('/', function(req, res){ res.send('hello world'); }); // accept one file where the name of the form field is named photho app.post('/', upload.single('photho'), function(req, res){ console.log(req.body); // form fields console.log(req.file); // form files res.status(204).end(); }); app.listen(3000);
好的,我實際上剛剛寫完原始數據。 如果將inMemory
設置為true
,則會將原始數據發送到req.files.file.buffer。 這是最終的,有效的解決方案:
express.js
// Using Multer for file uploads.
app.use(multer({
dest: './public/profile/img/',
limits: {
fieldNameSize: 50,
files: 1,
fields: 5,
fileSize: 1024 * 1024
},
rename: function(fieldname, filename) {
return filename;
},
onFileUploadStart: function(file) {
console.log('Starting file upload process.');
if(file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png') {
return false;
}
},
inMemory: true //This is important. It's what populates the buffer.
}));
server_controller_file.js
exports.imageUpload = function(req, res) {
var file = req.files.file,
path = './public/profile/img/';
// Logic for handling missing file, wrong mimetype, no buffer, etc.
var buffer = file.buffer, //Note: buffer only populates if you set inMemory: true.
fileName = file.name;
var stream = fs.createWriteStream(path + fileName);
stream.write(buffer);
stream.on('error', function(err) {
console.log('Could not write file to memory.');
res.status(400).send({
message: 'Problem saving the file. Please try again.'
});
});
stream.on('finish', function() {
console.log('File saved successfully.');
var data = {
message: 'File saved successfully.'
};
res.jsonp(data);
});
stream.end();
console.log('Stream ended.');
};
我找到了一個busboy的例子:
exports.upload = function (req, res, next) {
req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
// ....
});
req.pipe(req.busboy);
};
multer也是一個busboy:
req.pipe(busboy);
https://github.com/expressjs/multer/blob/master/index.js#206
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.