基于Express+multer实现文件上传功能
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
1.涉及依赖包
- multer: 处理文件上传的
- cors: 处理跨域的
2.http-server
一个简单的http服务器,经常用于本地测试和开发
安装
使用
1 2 3 4 | // 在当前目录下建立http服务器,启动后可以直接打开输出内容里的ip地址 http-server . // 指定ip和端口号http-server [path] [options] http-server -a 127.0.0.1 -p 9090 |
启动后即可根据所启动服务器的地址来访问该服务下的资源,默认访问inex.html文件
3. 单文件上传
安装依赖
npm install express multer cors
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | const express = require( 'express' ); const multer = require( 'multer' ); const cors = require( 'cors' ); const app = express(); app.use(cors()); const upload = multer({ dest: 'files' }); app.post( '/upload' , upload.single( 'aaa' ), function (req, res, next) { console.log(req.file, 'file' ); console.log(req.body, 'body' ); }, function (err, req, res, next) {} ); app.listen(3333); |
app.use是使用cors中间件来处理跨域。
multer处理文件上传,指定保存文件的目录是files。
因为multer本身是一个函数,所以不需要app.use。
upload.single是在处理单文件的时候使用single。
upload.single('aaa')是指接文件的参数名是aaa。
创建一个index.html
文件来作为文件入口
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 | <!DOCTYPE html> < html lang = "en" > < head > < meta charset = "UTF-8" /> < meta http-equiv = "X-UA-Compatible" content = "IE=edge" /> < meta name = "viewport" content = "width=device-width, initial-scale=1.0" /> < title >Document</ title > < script src = "https://unpkg.com/axios@0.24.0/dist/axios.min.js" ></ script > </ head > < body > < input id = "fileInput" type = "file" /> < script > const fileInput = document.querySelector('#fileInput'); async function formData() { const data = new FormData(); data.set('name', 'yangmy'); data.set('age', 20); data.set('file', fileInput.files[0]); const res = await axios.post('http://localhost:3333/upload', data); } fileInput.onchange = formData; </ script > </ body > </ html > |
然后使用http-server
在当前目录下启动一个http
服务:
在当前目录下运行index.js
文件:
在浏览器中打开http-server
创建的服务地址,此时后默认打开index.html
文件:
选一张图片上传:
此时可以看到浏览器的请求参数以及服务端打印的日志:
浏览器:
服务端:
然后就可以看到我们代码中就会多出一个files
的文件夹,里面存放的是刚上传的问件:
4.多文件上传
在index.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 | const express = require( 'express' ); const multer = require( 'multer' ); const cors = require( 'cors' ); const app = express(); app.use(cors()); const upload = multer({ dest: 'files' }); app.post( '/upload' , upload.single( 'file' ), function (req, res, next) { console.log(req.file, 'file' ); console.log(req.body, 'body' ); }, function (err, req, res, next) {} ); app.post( '/uploads' , upload.array( 'filelist' , 2), function (req, res, next) { console.log(req.files, 'file' ); console.log(req.body, 'body' ); }, function (err, req, res, next) {} ); app.listen(3333); |
这里修改了index.js
文件,添加了/uploads
接口,用作处理多文件上传。相比于单文件上传,修改了以下:
upload.single('file')
改成了upload.array('filelist', 2)
,因为要上传多文件,所以single
变成了array
,第二个数字参数是文件上传的数量限制。
新建一个multis.html
用来当作多文件上传的页面,页面内容是:
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 | <!DOCTYPE html> < html lang = "en" > < head > < meta charset = "UTF-8" /> < meta http-equiv = "X-UA-Compatible" content = "IE=edge" /> < meta name = "viewport" content = "width=device-width, initial-scale=1.0" /> < title >Document</ title > < script src = "https://unpkg.com/axios@0.24.0/dist/axios.min.js" ></ script > </ head > < body > as < input id = "fileInput" type = "file" multiple /> < script > const fileInput = document.querySelector('#fileInput'); async function formData2() { const data = new FormData(); data.set('name', 'yangmy'); data.set('age', 20); [...fileInput.files].forEach((item) => { data.append('filelist', item); }); const res = await axios.post('http://localhost:3333/uploads', data); console.log(res); } fileInput.onchange = formData2; </ script > </ body > </ html > |
重新运行项目:node index.js
:
打开服务页面,路由中输入multis.html
路由,然后上传两个图片文件:
此时访问的是多文件上传页面,接口参数中的filelist
包含两个文件参数,再看控制台打印的日志:
如图:req.files
打印出两个文件的数据
如果我们上传超过2个文件的数据呢?上传超过规定的文件数量后,文件上传会失败,并不会上传到我们的files
文件夹中。
在多文件上传的接口代码中加入一个错误处理的中间件:
此时可以在接口函数的第四个参数中拿到错误信息,把错误信息打印一下,展示如下:
我们可以通过这个报错的code来处理返回结果,在index.js
的多文件上传接口后加上如下代码:
这样再次试试上传多个文件的情况:
此时便会根据错误处理的逻辑,当上传文件数量过多时接口会400,且返回to many file
的提示
5.多个字段上传文件且限制不同
在index.js
文件中添加一个新的接口uploadFileds
,作为上传多个字段,且限制不同的接口,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | app.post( '/uploadFileds' , upload.fields([ { name: 'files1' , maxCount: 2 }, { name: 'files2' , maxCount: 3 }, ]), function (req, res, next) { console.log(req.files, 'file' ); console.log(req.body, 'body' ); }, function (err, req, res, next) { console.log(err, 'err' ); if (err.code === 'LIMIT_UNEXPECTED_FILE' ) { res.status(400).end( 'to many files' ); } } ); |
其中upload.fields
指定了每个字段的字段名以及该字段名接收文件的限制,然后接收到请求后同样使用req.files来获取文件信息。
然后新建multisFileds.html
文件,作为这个测试的页面,代码如下:
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 | <!DOCTYPE html> < html lang = "en" > < head > < meta charset = "UTF-8" /> < meta http-equiv = "X-UA-Compatible" content = "IE=edge" /> < meta name = "viewport" content = "width=device-width, initial-scale=1.0" /> < title >Document</ title > < script src = "https://unpkg.com/axios@0.24.0/dist/axios.min.js" ></ script > </ head > < body > < input id = "fileInput" type = "file" multiple /> < script > const fileInput = document.querySelector('#fileInput'); async function formData2() { const data = new FormData(); data.set('name', 'yangmy'); data.set('age', 20); data.append('files1', fileInput.files[0]); data.append('files1', fileInput.files[1]); data.append('files2', fileInput.files[2]); data.append('files2', fileInput.files[3]); data.append('files2', fileInput.files[4]); const res = await axios.post( 'http://localhost:3333/uploadFileds', data ); console.log(res); } fileInput.onchange = formData2; </ script > </ body > </ html > |
其中上传的字段名和接口中定义的都必须对应才可以。
访问multisFileds.html
页面,并上传五张图片文件
上传成功后我们看到存放文件夹的文件确实多了五条数据,且,控制台也打印出这些文件的信息
6.不确定上传文件的字段
不确定上传文件的字段以及限制时,使用upload.any()
来接收文件。
再次在index.js
中新增一个接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | app.post( '/uploadfileNoname' , upload.any(), function (req, res, next) { console.log(req.files, 'file' ); console.log(req.body, 'body' ); }, function (err, req, res, next) { console.log(err, 'err' ); if (err.code === 'LIMIT_UNEXPECTED_FILE' ) { res.status(400).end( 'to many files' ); } } ); |
复用multisFileds.html
文件,将上传的接口改为uploadfileNoname
重新运行express应用,然后在浏览器中打开multisFileds.html
页面,选中文件上传
上传成功后看到files文件夹下面又多了5条文件数据
这时控制台日志打印的文件内容包含有所上传的文件信息,但是这次没有字段名,字段名都在文件信息中,需要一个个去遍历处理
7.保存上传的文件名
之前通过dest指定了保存文件的路径是files文件夹,现在修改一下,通过multer.diskStorage()
方法来配置filename
、destination
参数,使其将文件保存在指定的文件夹,且指定文件名和文件名后缀 在index.js
中添加如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | const fs = require( 'fs' ); const path = require( 'path' ); const storage = multer.diskStorage({ // 目录 destination: (req, file, cb) => { try { fs.mkdirSync(path.join(process.cwd(), 'uploadFile' )); } catch (e) {} cb( null , path.join(process.cwd(), 'uploadFile' )); }, // 文件名 filename: (req, file, cb) => { cb( null , file.originalname); }, }); const upload = multer({ storage }); |
要注意destination
和filename
中的回调函数cb
的第一个参数是传的错误信息,所以这里要注意传null。
生成的storage
要放到const upload = multer({ storage });
中,这样上传时就会走写的那个方法了。
然后我们在上一个例子中使用上传功能,成功上传图片后,发现上传的图片出现在了定义的uploadFile
文件夹下,且名字我们使用的是上传文件原本的名称
以上就是基于Express+multer来实现文件上传功能的详细内容,更多关于Express multer文件上传功能的资料请关注脚本之家其它相关文章!

微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
nvm报错Now using node v版本号(64-bit)图文解决方法
这篇文章主要给大家介绍了关于nvm报错Now using node v版本号(64-bit)的解决方法,文中将解决的办法介绍的非常详细,对遇到这个问题的朋友具有一定的参考借鉴价值,需要的朋友可以参考下2023-11-11使用node-canvas在服务端渲染echarts图表解析
这篇文章主要介绍了使用node-canvas在服务端渲染echarts图表解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-10-10
最新评论