推荐答案
// www.javascriptcn.com code example
const fastify = require('fastify')({ logger: true });
const path = require('path');
const fs = require('fs');
// 注册 fastify-multipart 插件
fastify.register(require('fastify-multipart'));
// 处理文件上传的路由
fastify.post('/upload', async (request, reply) => {
const data = await request.file();
// 确保文件存在
if (!data) {
return reply.status(400).send({ message: 'No file uploaded' });
}
// 保存文件到指定目录
const filePath = path.join(__dirname, 'uploads', data.filename);
const writeStream = fs.createWriteStream(filePath);
data.file.pipe(writeStream);
return reply.send({ message: 'File uploaded successfully', filename: data.filename });
});
// 启动服务器
fastify.listen(3000, (err) => {
if (err) {
fastify.log.error(err);
process.exit(1);
}
fastify.log.info(`Server listening on http://localhost:3000`);
});本题详细解读
1. 引入必要的模块
首先,我们需要引入 fastify、path 和 fs 模块。fastify 用于创建服务器,path 用于处理文件路径,fs 用于文件系统操作。
2. 注册 fastify-multipart 插件
使用 fastify.register 方法注册 fastify-multipart 插件。这个插件会自动处理 multipart 表单数据,包括文件上传。
3. 创建文件上传路由
在 /upload 路由中,我们使用 request.file() 方法来获取上传的文件。request.file() 返回一个包含文件信息的对象,包括文件名、文件流等。
4. 检查文件是否存在
在处理文件之前,我们需要检查是否有文件被上传。如果没有文件上传,返回 400 状态码和错误信息。
5. 保存文件到指定目录
使用 fs.createWriteStream 创建一个可写流,将上传的文件保存到指定的目录中。data.file.pipe(writeStream) 将文件流写入到目标路径。
6. 返回成功响应
文件上传成功后,返回一个包含成功信息和文件名的 JSON 响应。
7. 启动服务器
最后,使用 fastify.listen 方法启动服务器,监听 3000 端口。
通过以上步骤,你可以使用 fastify-multipart 插件轻松处理文件上传。