# 一、简介

multer 更新到 1.x 之后无法直接通过 app.use(multer()); 这样的方式去使用。
multer 的 文档地址:
https://github.com/expressjs/multer
中文文档的翻译也是 2016 年 10 月的,不建议看中文文档。
安装:

yarn add multer

引入:

const multer = require('multer');

# 二、基本使用 - 上传单文件

上面已经引入了 <font style="color: red;"> express </font>、<font style="color: red;"> body-parser </font>、<font style="color: red;"> multer </font>、<font style="color: red;"> path </font>

const app = express();
const upload = multer({dest:path.join(__dirname,'./public/uploads')});
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());
app.use('/',express.static('views'));
app.post('/',upload.single('file'),(req,res)=>{
  res.send(req.file);
});

HTML 页面:

文件上传后,信息会存储在 req.file,主要信息是下面:

# 三、diskStorage 指定存储路径和文件名

上面上传单文件的方法简答粗暴,并且有很大的问题,不能保存文件后缀(可以看上面的文件 path,没有后缀)

const app = express();
const storage = multer.diskStorage({
  // destination:'public/uploads/'+new Date().getFullYear() + (new Date().getMonth()+1) + new Date().getDate(),
  destination(req,res,cb){
    cb(null,'public/uploads/'+new Date().getFullYear() + (new Date().getMonth()+1) + new Date().getDate());
  },
  filename(req,file,cb){
    const filenameArr = file.originalname.split('.');
    cb(null,Date.now() + '-' + filenameArr[filenameArr.length-1]);
  }
});
const upload = multer({storage});
app.use(bodyParser.urlencoded({extended:true}));
app.use('/index',express.static('./views/index.html'));
app.post('/',upload.single('file'),(req,res)=>{
  console.log(req.body);
  console.log(req.file);
  res.send(req.file);
});

上面的关键方法就是:

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, '/tmp/my-uploads')
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now())
  }
})
var upload = multer({ storage: storage })
  • destination 如果是一个函数,则下面的路径必须是已经存在的路径,否则汇报错误:路径不存在
    比如下面的报错: Error: ENOENT: no such file or directory, open 'E:\Aprojects\node_projects\nodejs\20180504\demo3\public\uploads\201854\1525428354038-jpg
  • destination 如果是一个字符串,则路径不需要必须存在,只要能够创建路径就 OK