# 一、简介
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