Fork me on GitHub

Node.js使用multer上传文件(五)

深入multer上传(二)

前一篇文章中介绍了multer模块中有关自定义存储相关的知识,这一篇开始对上传的文件类型进行控制并处理相关的错误。

1.1. 新建app6.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
const app = require('express')()
const multer = require('multer')
const log = console.log
const fs = require('fs')
/**
* destination指定上传的目录:
* 可以在程序中通过函数创建目录,也可以事先准备好目录
* filename指定上传后的文件名称:
* 为避免上传文件名的重复导致之前上传的被覆盖,采用加入时间来处理
*/
// 指定上传的路径,需要自行创建
const uploadFolder = 'upload'
//判断上传路劲是否存在,没有就新建
const createFolder = function(folder) {
try {
fs.accessSync(folder)
} catch (e) {
fs.mkdirSync(folder)
}
}
createFolder(uploadFolder)
const storage = multer.diskStorage({
destination: function(req, file, cb) {
cb(null, uploadFolder)
},
filename: function(req, file, cb) {
cb(null, `${Date.now()}-${file.originalname}`)
}
})
const fileFilter = function(req, file, cb) {
//设置允许上传jpeg格式的图片
if (file.mimetype === 'image/jpeg') {
cb(null, true)
} else {
// 如果使用cb(null, false)的话,满足条件的文件会被上传
//如果上传的文件中包含了不允许的文件类型,则抛出错误,所有的文件均不能上传
cb(new Error('文件上传类型错误'))
}
}
const upload = multer({
storage: storage,
fileFilter: fileFilter
})
app.listen(3000)
app.post('/upload', function(req, res) {
upload.array('avatar', 3)(req, res, function(err) {
const files = req.files
log(files)
log(err)
if (err) {
res.send('部分文件类型错误')
} else {
res.send(files.length + '个文件已上传')
}
})
})
app.get('/', function(req, res) {
res.sendFile('index6.html')
})

1.2. 新建index6.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>有拦截的上传Demo</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="avatar">
<br>
<input type="file" name="avatar">
<br>
<input type="file" name="avatar">
<br>
<input type="submit" value="提交">
</form>
</body>
</html>

1.3. 项目目录

项目目录

1.4. 运行项目

nodemon app6.js

1.5. 实际结果

1.5.1 访问http://localhost:3000

访问

1.5.2. 选取多个文件上传

上传1

1.5.3. 上传成功

案例2

1.5.4. 控制台输出

控制台1

1.5.5. upload目录变化

upload目录变化

1.5.6. 项目目录变化

项目目录变化

1.6 包含非法文件类型时

1.6.1 访问http://localhost:3000

访问

1.6.2. 选取多个文件上传

上传1

1.6.3. 上传失败

案例2

1.6.4. 控制台输出

控制台1

1.6.5 upload目录变化

因为处理了错误,导致上传中断,没有任何文件得到上传,如果只过滤错误的文件类型而允许正确的类型上传,可以将代码中提及的cb(new Error('文件上传类型错误'))替换为cb(null,false)即可

说明: 官方文档中提及的limits相关的内容不再分析,有兴趣的可自行研究。所有有关multer模块的内容到此结束。