【 Node 】图片上传

Multer

Multer 是一个 node.js 中间件
用于处理 multipart/form-data 类型的表单数据
它主要用于上传文件

安装

npm i multer --save	

使用

// 引入需要的模块
const express = require('express')
const multer = require('multer')
const ejs = require('ejs')
const path = require('path')

// 实例化express
const app = express()

// 设置模板引擎
app.set('view engine', 'ejs')
// 配置静态文件
app.use(express.static('./public'))

// 创建存储引擎
const storage = multer.diskStorage({
    // 设置文件存储地址
    destination: function (req, file, callback) {
        callback(null, './public/uploads')
    },
    // 文件名
    filename: function (req, file, callback) {
        callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
    }
})
// 初始化upload 单个文件上传
const upload = multer({
    // 存储引擎
    storage: storage,
    // 文件过滤
    fileFilter: function (req, file, callback) {
        checkFileType(file, callback);
    },
    // 限制图片大小 默认是 1 M
    limits: { fieldSize: 1000000 }
}).single('myImage')

// 验证文件类型
function checkFileType(file, cb) {
    // 允许的文件扩展名格式
    const filetypes = /jpeg|jpg|png|gif/;
    // 验证扩展名
    const extname = filetypes.test(path.extname(file.originalname).toLowerCase());
    // 验证MIME
    const mimetype = filetypes.test(file.mimetype);

    if (mimetype && extname) {
        return cb(null, true);
    } else {
        cb('格式错误:只支持图片格式!')
    }
}

// 捕获客户端的POST
app.post('/uploads', (req, res) => {
    upload(req, res, (err) => {
        if (err) {
            res.render('index', { msg: err })
        } else {
            console.log(req.file);
            if (req.file === undefined) {
                res.render('index', { msg: "请选择上传文件" })
            } else {
                res.render('index', { msg: "图片上传成功", file: `uploads/${req.file.filename}` })
            }
        }
    })
})

app.get('/', (req, res) => {
    // 渲染展示页面
    res.render('index')
})

// 监听端口
const PORT = 4000
app.listen(PORT, () => { console.log(`服务器已经在${PORT}下运行`) });

初始化

const upload = multer({
	// dest || storage 在哪里存储文件
	// dest:'uploads/’,
	// 或者为了进行更多的控制 可以使用磁盘存储引擎
	storage: storage,
	
	// 文件过滤器 控制文件哪些可以被接受
	fileFilter:function(req, file, callback){
		// coding
	},

	// 限制上传数据的大小
	// 可以帮助保护你的站点抵御拒绝服务 (DoS) 攻击。
	 limits: { 
	 	// 默认是 1M
	 	fieldSize: <上传文件的大小>}
})

方法

const upload = multer({
	// coding
})

// req.file
.single(fieldname)

// req.files
.array(fieldname,<限制上传的最大数量>)

// req.files  fields里面保存的是对象数组
// [{name:"xxxx",maxCount:<number>}]
.fields(fields)

// 只接受文本域  ,将发生 "LIMIT_UNEXPECTED_FILE" 错误。这和 upload.fields([]) 的效果一样。
.none()


// req.files
// 接受一切上传的文件
.any()

磁盘存储引擎

磁盘存储引擎 (diskStorage )可以控制文件的存储

const storage = multer.diskStorage({
	// 需要创建存储文件的文件夹
	destination:function(req,file,callback){
		callback(null,'<上传文件的保存路径>')
	}	
	filename:function(req,file,callback){
		callback(null,'<上传文件的文件名>')
	}
})

错误处理机制

// 接收前端传递过来的
app.post('/profile', function (req, res) {
  upload(req, res, function (err) {
    if (err instanceof multer.MulterError) {
      // 捕获错误
    } else if (err) {
      // 捕获错误
    }
    // 上传成功
  })
})

项目地址

Gitee

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值