Hapi.js 是一个现代化的 Node.js Web 框架,它提供了一套简单易用的 API,可以轻松构建 Web 应用程序。hapi-inert 是 hapi.js 的一个插件,它提供了一些静态文件服务的功能,包括文件上传和下载。本文将介绍如何使用 hapi-inert 实现文件上传和下载功能。
安装 hapi-inert
在开始之前,首先需要安装 hapi-inert 插件。可以使用 npm 命令进行安装:
npm install hapi-inert
安装完成后,在 hapi.js 项目中引入 hapi-inert 插件:
// javascriptcn.com 代码示例 const Hapi = require('@hapi/hapi'); const Inert = require('hapi-inert'); const server = new Hapi.Server({ port: 3000, host: 'localhost' }); const init = async () => { await server.register(Inert); // ... }; init();
实现文件上传
在实现文件上传功能之前,需要先创建一个表单,让用户可以选择要上传的文件。可以使用 HTML 的 <form>
标签来创建表单:
<form method="post" action="/upload" enctype="multipart/form-data"> <input type="file" name="file"> <button type="submit">Upload</button> </form>
这个表单包含一个文件选择框和一个提交按钮。enctype="multipart/form-data"
属性告诉浏览器这是一个文件上传表单。
在 hapi.js 中,可以使用 await request.payload.file
获取上传的文件。具体实现如下:
// javascriptcn.com 代码示例 server.route({ method: 'POST', path: '/upload', options: { payload: { output: 'stream', parse: true, allow: 'multipart/form-data' } }, handler: async (request, h) => { const data = request.payload; if (!data.file) { return h.response('No file uploaded').code(400); } const file = data.file; const filename = file.hapi.filename; const path = __dirname + '/uploads/' + filename; const fileStream = fs.createWriteStream(path); fileStream.on('error', (err) => console.error(err)); await file.pipe(fileStream); return h.response('File uploaded successfully').code(200); } });
在这个路由处理程序中,首先检查是否上传了文件。如果没有上传文件,返回 400 错误。然后获取上传的文件,包括文件名和文件流。最后将文件流写入到服务器上的一个文件中。
实现文件下载
要实现文件下载功能,需要创建一个路由,根据请求的 URL 返回相应的文件。可以使用 hapi-inert 插件中的 h.file()
方法来实现这个功能。
// javascriptcn.com 代码示例 server.route({ method: 'GET', path: '/download/{filename}', handler: (request, h) => { const filename = request.params.filename; const path = __dirname + '/uploads/' + filename; return h.file(path); } });
在这个路由处理程序中,首先获取要下载的文件名。然后将文件路径拼接起来,使用 h.file()
方法将文件发送给客户端。
示例代码
下面是完整的示例代码,包括文件上传和下载功能:
// javascriptcn.com 代码示例 const Hapi = require('@hapi/hapi'); const Inert = require('hapi-inert'); const fs = require('fs'); const server = new Hapi.Server({ port: 3000, host: 'localhost' }); const init = async () => { await server.register(Inert); server.route({ method: 'POST', path: '/upload', options: { payload: { output: 'stream', parse: true, allow: 'multipart/form-data' } }, handler: async (request, h) => { const data = request.payload; if (!data.file) { return h.response('No file uploaded').code(400); } const file = data.file; const filename = file.hapi.filename; const path = __dirname + '/uploads/' + filename; const fileStream = fs.createWriteStream(path); fileStream.on('error', (err) => console.error(err)); await file.pipe(fileStream); return h.response('File uploaded successfully').code(200); } }); server.route({ method: 'GET', path: '/download/{filename}', handler: (request, h) => { const filename = request.params.filename; const path = __dirname + '/uploads/' + filename; return h.file(path); } }); await server.start(); console.log('Server running on %s', server.info.uri); }; init();
总结
本文介绍了如何使用 hapi-inert 插件实现文件上传和下载功能。通过这个例子,可以了解如何使用 hapi.js 构建 Web 应用程序,并使用 hapi-inert 插件提供的功能扩展应用程序的功能。这个例子还可以作为一个模板,用于构建更复杂的 Web 应用程序。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/657d4501d2f5e1655d812dcc