技术文档

Express 4+ 文件上传

2018-02-22  本文已影响35人  R_X

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 });
    });
});
上一篇 下一篇

猜你喜欢

热点阅读