随着互联网的发展,文件上传和下载成为了 Web 应用中常见的功能之一。在 Hapi.js 中,实现文件上传和下载也变得非常简单和方便。本文将介绍如何使用 Hapi.js 实现文件上传和下载的功能。
文件上传
Hapi.js 提供了 hapi/nes
插件用于处理 WebSocket 连接。我们可以使用 nes
插件来实现文件上传的功能。下面是一个简单的文件上传的示例代码:
// javascriptcn.com 代码示例 const Hapi = require('@hapi/hapi'); const Nes = require('@hapi/nes'); const Fs = require('fs'); const server = new Hapi.Server({ port: 3000, routes: { files: { relativeTo: __dirname, }, }, }); const init = async () => { await server.register(Nes); server.route({ method: 'POST', path: '/upload', config: { payload: { output: 'stream', parse: true, allow: 'multipart/form-data', maxBytes: 1024 * 1024 * 100, // 100MB }, }, handler: async (request, h) => { const { payload } = request; const { file } = payload; if (!file) { return h.response('No file uploaded').code(400); } const fileName = file.hapi.filename; const filePath = `./uploads/${fileName}`; const fileStream = Fs.createWriteStream(filePath); file.on('data', (data) => { fileStream.write(data); }); file.on('end', () => { fileStream.end(); }); return h.response(`File ${fileName} uploaded`).code(200); }, }); await server.start(); console.log('Server running on %s', server.info.uri); }; process.on('unhandledRejection', (err) => { console.log(err); process.exit(1); }); init();
在上面的代码中,我们首先创建了一个 Hapi.js 服务器,并注册了 nes
插件。然后,我们定义了一个 POST 请求路由 /upload
,用于处理文件上传。在路由的配置中,我们指定了 payload
选项,用于解析文件上传的请求体。maxBytes
选项指定了上传文件的最大大小为 100MB。在路由的处理函数中,我们通过 request.payload
获取上传的文件,并将文件保存到本地文件系统中。
文件下载
Hapi.js 提供了 hapi/inert
插件用于处理静态文件。我们可以使用 inert
插件来实现文件下载的功能。下面是一个简单的文件下载的示例代码:
// javascriptcn.com 代码示例 const Hapi = require('@hapi/hapi'); const Inert = require('@hapi/inert'); const server = new Hapi.Server({ port: 3000, routes: { files: { relativeTo: __dirname, }, }, }); const init = async () => { await server.register(Inert); server.route({ method: 'GET', path: '/download/{fileName}', handler: async (request, h) => { const { fileName } = request.params; const filePath = `./uploads/${fileName}`; const fileStream = await Fs.createReadStream(filePath); return h.response(fileStream) .header('Content-Disposition', `attachment; filename=${fileName}`) .type('application/octet-stream'); }, }); await server.start(); console.log('Server running on %s', server.info.uri); }; process.on('unhandledRejection', (err) => { console.log(err); process.exit(1); }); init();
在上面的代码中,我们首先创建了一个 Hapi.js 服务器,并注册了 inert
插件。然后,我们定义了一个 GET 请求路由 /download/{fileName}
,用于处理文件下载。在路由的处理函数中,我们通过 request.params
获取要下载的文件名,并读取本地文件系统中的文件流。最后,我们将文件流作为响应体返回,并设置响应头的 Content-Disposition
字段为 attachment
,以指示浏览器下载文件。
总结
在本文中,我们介绍了如何使用 Hapi.js 实现文件上传和下载的功能。通过使用 nes
插件和 inert
插件,我们可以轻松地处理文件上传和下载的请求。希望本文对你有所帮助,谢谢阅读!
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/655dcb99d2f5e1655d8138c9