一、简洁

multer 更新到1.x之后无法直接通过 app.use(multer()); 这样的方式去使用。

multer 的 文档地址:

中文文档的翻译也是2016年10月的,不建议看中文文档。

安装:

yarn add multer

引入:

const multer = require('multer');

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

上面已经引入了 expressbody-parsermulterpath

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页面:

1.jpg

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

2.jpg

三、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