美文网首页技术文档
Express 4+ 文件上传

Express 4+ 文件上传

作者: R_X | 来源:发表于2018-02-22 18:06 被阅读35次

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 });
    });
});

相关文章

网友评论

    本文标题:Express 4+ 文件上传

    本文链接:https://www.haomeiwen.com/subject/wguztftx.html