Express 4 + 做文件上傳的時候會出現(xiàn):req.files = undefined
的情況瓤帚。
原因是:body-parser模塊僅處理JSON和urlencoded表單提交体啰,而不是multipart。
我們可以選擇:
connect-busboy
或者 multer
來處理滑绒。
1、connect-busboy
$ npm i connect-busboy --save
# app.js 中:
var busboy = require('connect-busboy');
app.use(busboy()); // 注意:這個一定要寫在所有的路由中間件之前。
app.use('/', index);
# upload_file.js 中:
exports.upload_file = function(req, res) {
var fstream;
req.pipe(req.busboy);
req.busboy.on('file', function (fieldname, file, filename) {
console.log("Uploading: " + filename);
fstream = fs.createWriteStream(path.join(__dirname, '../public/upload') + filename);
file.pipe(fstream);
fstream.on('close', function () {
cb(null, fstream);
});
});
}
2、multer
$ npm i multer --save
# /routes/index.js 路由中:
var express = require('express');
var router = express.Router();
var path = require('path');
var multer = require('multer');
var fs = require('fs');
var upload = multer({ dest: path.join(__dirname, '../public/upload/') });
// 注意:1患朱、'upload_file' 對應于 form 表單中的 name 屬性值。
// 2炊苫、代碼 執(zhí)行完 upload.single('upload_file') 的時候裁厅,文件就已經(jīng)上傳了冰沙,但是沒有后綴名,得手動改一下
router.post('/upload_bgImg', upload.single('upload_file'), function(req, res) {
var temp_path = req.file.path;
var ext = '.' + req.file.originalname.split('.')[1];
var target_path = req.file.path + ext;
var _filename = req.file.filename + ext;
var filePath = '/upload/' + _filename;
console.log("Uploading: " + _filename);
fs.rename(temp_path, target_path, function(err,data) {
cb(null, { file_path: filePath });
});
});