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 的服务器配置中引入文件上传插件:
// javascriptcn.com 代码示例 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 ]); // ... };
这样,我们就成功地引入了文件上传插件。
编写路由和处理函数
接下来,我们需要编写路由和处理函数来实现文件上传功能。
首先,我们需要定义一个上传文件的路由:
// javascriptcn.com 代码示例 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 中处理上传的文件:
// javascriptcn.com 代码示例 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 模块创建一个写入流,将文件数据写入到磁盘上。
最后,我们返回一个成功的响应。
完整示例代码
下面是一个完整的文件上传示例代码:
// javascriptcn.com 代码示例 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 的文件上传插件,包括安装和配置插件,以及编写路由和处理函数来实现文件上传功能。希望本文对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6571664bd2f5e1655da11845