Hapi 是一个基于 Node.js 的 web 开发框架,它的插件生态十分丰富,其中包括了文件上传插件,可以帮助我们方便地实现文件上传的功能。
在本文中,我们将介绍如何使用 Hapi 的文件上传插件,包括如何安装和配置插件,以及如何编写路由和处理函数来实现文件上传功能。
安装和配置 Hapi 的文件上传插件
首先,我们需要安装 Hapi 和文件上传插件:
npm install hapi @hapi/inert @hapi/hapi @hapi/boom @hapi/joi @hapi/pino @hapi/nes @hapi/glue @hapi/accept
其中,@hapi/inert 是 Hapi 中的一个静态文件处理插件,我们在文件上传中会用到。
接下来,我们需要在 Hapi 的服务器配置中引入文件上传插件:
// www.javascriptcn.com code example
const Hapi = require('@hapi/hapi');
const Inert = require('@hapi/inert');
const HapiUpload = require('hapi-upload-file');
const init = async () => {
const server = Hapi.server({
port: 3000,
host: 'localhost'
});
await server.register([
Inert,
HapiUpload
]);
// ...
};这样,我们就成功地引入了文件上传插件。
编写路由和处理函数
接下来,我们需要编写路由和处理函数来实现文件上传功能。
首先,我们需要定义一个上传文件的路由:
// www.javascriptcn.com code example
server.route({
method: 'POST',
path: '/upload',
options: {
payload: {
allow: 'multipart/form-data',
output: 'stream',
maxBytes: 1024 * 1024 * 10, // 限制上传文件大小为 10 MB
multipart: true,
parse: true
}
},
handler: async (request, h) => {
const { payload } = request;
// 处理上传的文件
// ...
return { success: true };
}
});在路由中,我们使用了 Hapi 的 payload 选项来配置上传文件的相关参数。其中,allow 表示允许上传的文件类型,output 表示输出流,maxBytes 表示最大上传文件大小,multipart 表示启用 multipart/form-data,parse 表示解析表单数据。
接下来,我们需要在 handler 中处理上传的文件:
// www.javascriptcn.com code example
const fs = require('fs');
const path = require('path');
const handler = async (request, h) => {
const { payload } = request;
const { file } = payload;
const filename = file.hapi.filename;
const data = file._data;
const filepath = path.join(__dirname, filename);
const writer = fs.createWriteStream(filepath);
writer.on('error', function (err) {
console.error(err);
});
data.pipe(writer);
return { success: true };
};在 handler 中,我们首先获取上传的文件信息,包括文件名和文件数据。然后,我们使用 fs 模块创建一个写入流,将文件数据写入到磁盘上。
最后,我们返回一个成功的响应。
完整示例代码
下面是一个完整的文件上传示例代码:
// www.javascriptcn.com code example
const Hapi = require('@hapi/hapi');
const Inert = require('@hapi/inert');
const HapiUpload = require('hapi-upload-file');
const fs = require('fs');
const path = require('path');
const init = async () => {
const server = Hapi.server({
port: 3000,
host: 'localhost'
});
await server.register([
Inert,
HapiUpload
]);
server.route({
method: 'POST',
path: '/upload',
options: {
payload: {
allow: 'multipart/form-data',
output: 'stream',
maxBytes: 1024 * 1024 * 10, // 限制上传文件大小为 10 MB
multipart: true,
parse: true
}
},
handler: async (request, h) => {
const { payload } = request;
const { file } = payload;
const filename = file.hapi.filename;
const data = file._data;
const filepath = path.join(__dirname, filename);
const writer = fs.createWriteStream(filepath);
writer.on('error', function (err) {
console.error(err);
});
data.pipe(writer);
return { success: true };
}
});
await server.start();
console.log('Server running on %s', server.info.uri);
};
process.on('unhandledRejection', (err) => {
console.log(err);
process.exit(1);
});
init();总结
本文介绍了如何使用 Hapi 的文件上传插件,包括安装和配置插件,以及编写路由和处理函数来实现文件上传功能。希望本文对你有所帮助。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/6571664bd2f5e1655da11845