Express 4 + 做文件上传的时候会出现: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、代码 执行完 upload.single('upload_file') 的时候,文件就已经上传了,但是没有后缀名,得手动改一下
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 });
});
});