首先我们需要了解一下什么是Multer。Multer是一个node.js中间件,用于处理multipart/form-data
类型的表单数据,主要用于上传文件。在node.js中,文件上传非常容易实现,但是处理文件上传时需要对文件进行验证,以确保上传的文件符合我们的需求。这就是Multer的作用所在。
安装Multer
我们可以通过npm来安装Multer,执行下面的代码即可:
npm install multer
Multer的使用
单文件上传
先看一个实现单文件上传的例子:
const express = require('express');
const multer = require('multer');
const app = express();
// 确定上传文件的存储路径和文件名称
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, '../uploads')
},
filename: (req, file, cb) => {
cb(null, Date.now() + '-' + file.originalname)
}
});
// 创建Multer实例
const upload = multer({ storage });
// 处理上传的文件
app.post('/upload', upload.single('file'), (req, res) => {
// 文件上传成功,返回上传结果
res.send({
message: '上传成功',
filename: req.file.filename,
size: req.file.size
});
});
// 启动服务器
app.listen(8000, () => {
console.log('Server start on port 8000');
});
在上面的代码中,我们首先使用storage
对象定义了文件上传时存储的路径和文件名。然后创建了Multer实例,并将storage
对象作为参数传入Multer构造函数中。
在Multer实例创建完成之后,我们通过upload.single()
方法指定上传的文件类型为单个文件(即上传一个文件),同时指定上传文件的参数名称为file
。
接着在使用app.post()
方法定义请求方法和路由之后,我们在回调函数中通过req.file
获取上传的文件信息,并返回上传结果。
最后启动HTTP服务器,就可以使用上面代码实现上传单个文件功能。
多文件上传
下面是实现多文件上传的代码示例:
const express = require('express');
const multer = require('multer');
const app = express();
// 定义上传文件的存储路径和文件名称
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, '../uploads')
},
filename: (req, file, cb) => {
cb(null, Date.now() + '-' + file.originalname)
}
});
// 创建Multer实例
const upload = multer({ storage });
// 处理上传的文件,指定上传的文件类型为多个文件
app.post('/upload', upload.array('files', 10), (req, res) => {
// 文件上传成功,返回上传结果
res.send({
message: '上传成功',
files: req.files.map(file => ({
filename: file.originalname,
size: file.size
}))
});
});
// 启动HTTP服务器
app.listen(8000, () => {
console.log('Server start on port 8000');
});
在上面的代码中,我们使用upload.array()
方法指定上传的文件类型为多个文件,同时指定上传文件的参数名称为files
。
在Multer完成文件上传之后,我们可以通过req.files
获取上传的所有文件信息,并返回上传结果。
文件下载
文件上传之后,一般需要提供文件下载的服务。实现文件下载非常简单,只需要修改服务器端的请求处理即可。
const fs = require('fs');
const path = require('path');
const express = require('express');
const app = express();
// 处理文件下载请求
app.get('/download/:file', (req, res) => {
const file = path.join('../uploads', req.params.file);
// 判断要下载的文件是否存在
if (!fs.existsSync(file)) {
res.status(404).send('File not found');
return;
}
// 设置响应头,告诉客户端要下载的文件信息
res.set({
'Content-Type': 'application/octet-stream',
'Content-Disposition': `attachment; filename=${encodeURI(req.params.file)}`
})
// 使用流式方式读取文件,并将文件内容写入响应流
const stream = fs.createReadStream(file);
stream.pipe(res);
});
// 启动HTTP服务器
app.listen(8000, () => {
console.log('Server start on port 8000');
});
在上面的代码中,我们通过app.get()
方法定义了一个文件下载的API。在处理文件下载请求之前,我们首先要判断要下载的文件是否存在。
如果要下载的文件不存在,则返回404错误。
如果要下载的文件存在,则设置响应头信息,告诉客户端要下载的文件类型和名称。然后使用流式方式读取文件内容,将文件内容写入响应流中,最终实现文件下载功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodejs multer实现文件上传与下载 - Python技术站