图片上传原理:
- 将.jpg, .MP3,.mp4,.png,.ppt,.js,.html,.excel,.gif等文件转换成数据流形式进行传递到服务器,服务器将传递过来的信息以文件形式保存起来。上传图片必须使用post的方法进行提交。
- 使用multer第三方插件可以方便的实现文件上传。
yarn add multer // 安装
// 简单版的实现
const express=require('express');
const router=express.Router();
const multer = require('multer');
var storage = multer.diskStorage({
// 设置上传后的文件路径
destination: function (req, file, cb) {
cb(null, './uploads');
},
// 给上传文件重命名
filename: function (req, file, cb) {
cb(null, 'hello.jpg')
}
})
var upload = multer({ storage: storage })
router.post('/upload', upload.single('logo'), (req, res)=>{
// 文件信息都在req.file中
// single中logo要与前端传递过来key保持一致,否则上传失败
console.log(req.file);
res.send({success: true, message: '上传图片成功'});
})
module.exports=router;
- 如果要限制上传大小,文件类型需要做如下修改。
const express=require('express');
const router=express.Router();
const multer = require('multer');
const moment = require('moment');
/**
* @api {post} /file/upload 文件上传
* @apiName upload
* @apiGroup File
*
* @apiSuccess {Boolean} success 是否成功.
* @apiSuccess {String} message 返回信息.
* @apiSuccess {String} imgUrl 图片地址.
*/
var storage = multer.diskStorage({
// 设置上传后的文件路径
destination: function (req, file, cb) {
cb(null, './uploads');
},
// 给上传文件重命名
filename: function (req, file, cb) {
console.log(file);
// 获取上传文件后缀名
const ext=file.originalname.split('.')[1];
const tmpname=moment().format("YYYY-MM-DD-HH-mm-ss")+parseInt(Math.random()*10000);
// 防止文件名重复,重命名如下
cb(null, `${tmpname}.${ext}`);
}
})
var upload = multer({ storage: storage })
router.post('/upload', upload.single('logo'), (req, res)=>{
// 文件信息都在req.file中
// mimetype为 'image/jpeg'
console.log(req.file, '文件信息')
const { size, mimetype } = req.file;
const types=['jpg', 'jpeg', 'png', 'gif'];
const tipType=mimetype.split('/')[1];
if(size>500000){
return res.send({success: false, message: '文件大小500K'});
}else if(types.indexOf(tipType)==-1){
return res.send({success: false, message: '文件格式错误'});
}else{
const url=`uploads/${req.file.filename}`
res.send({success: true, message: '上传图片成功', imgUrl: url});
}
});
module.exports=router;