NodeJS + Express 實作檔案上傳
『Express Web Framework』是基於『Connect Middleware Framework』所開發,大部份的常見功能,藉由 Connect 本身支援或 Connect 的第三方(Third-party)模組,就可以實作出來。如果要實作檔案上傳的功能,可以使用第三方模組『connect-form』來達成。
直接透過 npm 安裝需要的模組:
在 app.js 中實作:
後記
本文的範例與 express 所提供的是一樣的,只是在 app.configure() 裡多了幾行 app.use()。其實目的只是希望告訴讀者,務必要在 app.router 之前引入 connect-form。原因是在 Express Web Framework 設計上,每次處理 Request 時,會依照 app.use() 所引入的順序去使用模組。
由於原生的 app.router 並不處理上傳檔案的特殊需求,我們一定要在 Request 經過 app.router 導引並進入 app.post() 所定義的 handler 之前,讓 connect-form 先行遇處理和檢查 Request 是否為上傳檔案,進而擴充功能甚至進一步分析處理。
直接透過 npm 安裝需要的模組:
npm install connect-form
在 app.js 中實作:
var express = require('express');
var form = require('connect-form');
var app = module.exports = express.createServer();
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(form({
keepExtensions: true,
uploadDir: __dirname + '/uploads'
}));
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
app.get('/', function(req, res) {
res.send('<form method="post" enctype="multipart/form-data">'
+ '<p>Image: <input type="file" name="image" /></p>'
+ '<p><input type="submit" value="Upload" /></p>'
+ '</form>');
});
app.post('/', function(req, res, next) {
req.form.complete(function(err, fields, files){
if (err) {
next(err);
} else {
console.log('\nuploaded %s to %s'
, files.image.filename
, files.image.path);
res.redirect('back');
}
});
req.form.on('progress', function(bytesReceived, bytesExpected){
var percent = (bytesReceived / bytesExpected * 100) | 0;
process.stdout.write('Uploading: %' + percent + '\r');
});
});
app.listen(3000);後記
本文的範例與 express 所提供的是一樣的,只是在 app.configure() 裡多了幾行 app.use()。其實目的只是希望告訴讀者,務必要在 app.router 之前引入 connect-form。原因是在 Express Web Framework 設計上,每次處理 Request 時,會依照 app.use() 所引入的順序去使用模組。
由於原生的 app.router 並不處理上傳檔案的特殊需求,我們一定要在 Request 經過 app.router 導引並進入 app.post() 所定義的 handler 之前,讓 connect-form 先行遇處理和檢查 Request 是否為上傳檔案,進而擴充功能甚至進一步分析處理。
留言
張貼留言