一、简介
multer
更新到1.x
之后无法直接通过 app.use(multer());
这样的方式去使用。
multer 的 文档地址:
https://github.com/expressjs/multer
中文文档的翻译也是2016年10月的,不建议看中文文档。
安装:
yarn add multer
引入:
const multer = require('multer');
二、基本使用 - 上传单文件
上面已经引入了
express
、body-parser
、multer
、path
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