在现代 Web 应用程序中,文件上传是一个常见的需求。而 Hapi.js 框架可以让我们轻松完成这个任务。在本篇文章中,我们将深入讲解 Hapi.js 执行文件上传的完整流程。我们将从以下几个方面讨论文件上传:
- 使用 Hapi.js 实现文件上传的基本步骤
- 如何处理上传的文件
- 如何设置文件上传的参数
- 如何在 Hapi.js 中执行多个文件上传
使用 Hapi.js 实现文件上传的基本步骤
Hapi.js 框架提供了一个插件 hapi-boom-decorators
,它能够让我们非常方便地在 Hapi.js 应用程序中实现文件上传。我们只需要按照以下步骤安装并使用该插件即可:
- 安装
hapi-boom-decorators
插件:
npm install hapi-boom-decorators --save
- 将该插件添加到 Hapi.js 应用程序中:
const Hapi = require('hapi'); const server = new Hapi.Server({ port: 3000 }); const plugins = [ require('hapi-boom-decorators') ]; await server.register(plugins);
- 创建
POST
路由来接受上传文件:
-- -------------------- ---- ------- -------------- ------- ------- ----- ---------- -------- - -------- - ------- --------- ------ ----- ------ --------------------- - -- -------- ----- --------- -- -- - ----- - ---- - - ---------------- -- -------- ------ ----------------------- - --
在上面的代码中,我们创建了一个 POST
路由来接受上传文件。为了支持文件上传,我们需要在 options.payload
中添加 { allow: 'multipart/form-data' }
属性,且设置 payload.output
为 'stream'
以及 payload.parse
为 true
。
接下来,我们可以通过 request.payload
获取上传的文件并在 handler
中进行处理。上面的代码中,我们将上传的文件存储在了 file
变量中。
至此,我们已成功实现了文件上传的基本功能。在下面的小节中,我们将讨论如何处理上传的文件并设置文件上传的参数。
如何处理上传的文件
当用户上传一个文件时,我们往往需要对该文件进行处理,例如将其保存到服务器上或者向第三方服务发送该文件。在 Hapi.js 中,我们可以通过以下方式访问上传的文件:
const { file: { hapi } } = request.payload; const { filename, headers, path } = hapi;
通过 request.payload.file.hapi
,我们可以访问上传文件的相关信息,例如文件名、请求头和文件路径等。其中,path
属性包含了上传文件的本地路径,我们可以将其读取出来来处理上传文件的操作。示例如下:
const { file: { hapi } } = request.payload; const { filename, headers, path } = hapi; // 处理上传文件的逻辑 const fs = require('fs'); const file = fs.readFileSync(path); // 将 file 存储到服务器上
我们可以通过 fs.readFileSync
方法读取文件流将文件存储到服务器上。当然,我们还需要在处理完上传文件之后将其删除,以便及时释放磁盘空间。这里提供了另一种方式,可以手动删除上传的文件。
request.events.once('response', () => { fs.unlink(path, err => console.log(err)); });
在以上代码中,我们在服务器响应完成后,通过 fs.unlink
方法删除上传的文件。
如何设置文件上传的参数
在 Hapi.js 中,我们可以通过 payload.output
和 payload.parse
属性设置文件上传的参数。其中,payload.output
用于设置输出的格式,支持以下几种选项:
'data'
: 上传数据将会被转换成一个字符串。'stream'
: 上传数据将会被转换成一个可读的流。'file'
: 上传数据将会被转换成一个文件。
而 payload.parse
属性用于设置解析请求体的方式:
true
: 告诉 Hapi.js 自动手工解析上传数据。false
: 告诉 Hapi.js 不要解析上传数据,可以手动解析。'gunzip'
: 告诉 Hapi.js 在自动解析上传数据之前解压编码过的上传数据。
在以下示例代码中,我将 payload.output
属性修改为 'data'
,以便在 handler
中更方便地处理上传数据。
-- -------------------- ---- ------- ----- ------ - --- ------------- ----- ---- --- -------------- ------- ------- ----- ---------- -------- - -------- - ------- ------- ------ ----- ------ ---------------------- --------- ---- - ---- - -- -- --------- --- - -- -------- ----- --------- -- -- - ----- - ----- - ----- - ----- -------- - - - - ---------------- ----- -------- - ----- ---------------------- -- - -------- ------- ------ ----------------------- -- -- ----- ---------------
在上面的代码中,我们通过将 payload.output
设为 'data'
后就可以直接在 handler
中通过 request.payload
获取上传数据了。另外,我们还添加了一个名为 maxBytes
的属性来限制上传文件的最大大小。在处理上传文件时,我们可以通过 fs.readFileSync
方法读取文件并作进一步处理,例如将文件存储到服务器上或者将文件发送给第三方服务。处理完上传文件之后,我们返回一个空的响应。
如何在 Hapi.js 中执行多个文件上传
在许多应用程序中,我们需要允许用户上传多个文件。而在 Hapi.js 中,我们同样可以实现多个文件上传。我们只需要在 handler
中访问 request.payload
,然后对其中的上传文件进行遍历即可。下面是一个完整的实例代码:
-- -------------------- ---- ------- -------------- ------- ------- ----- ---------- -------- - -------- - ------- --------- ------ ----- ------ ---------------------- --------- ---- - ---- - -- -- --------- --- ---------- ---- - -- -------- ----- --------- -- -- - ----- ----- - --------------------- --- ------ ---- -- ------ - ----- - ----- - --------- ----- - - ----- ----- ------ - ----- ---------------------- -- -------- - ------ ------ -------- --------------- - --
在上面的代码中,我们首先访问 request.payload
获取上传的文件。由于允许上传多个文件,我们需要对文件进行遍历。在文件遍历过程中,我们可以获取上传文件的相关信息 filename
和 path
,然后读取文件的信息 fs.readFileSync(path)
,并进行处理操作。最后,我们返回一个简单的响应信息表明文件上传成功。
总结
在本文中,我们详细讲解了 Hapi.js 执行文件上传的完整流程,并介绍了上传文件的基本操作、如何处理上传文件、文件上传的配置以及如何执行多个文件上传。希望在阅读完本文之后,你能够对 Hapi.js 文件上传的操作有更深入的理解。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645a256c968c7c53b0c47c9b