Hapi.js 执行文件上传的完全指南

阅读时长 7 分钟读完

在现代 Web 应用程序中,文件上传是一个常见的需求。而 Hapi.js 框架可以让我们轻松完成这个任务。在本篇文章中,我们将深入讲解 Hapi.js 执行文件上传的完整流程。我们将从以下几个方面讨论文件上传:

  1. 使用 Hapi.js 实现文件上传的基本步骤
  2. 如何处理上传的文件
  3. 如何设置文件上传的参数
  4. 如何在 Hapi.js 中执行多个文件上传

使用 Hapi.js 实现文件上传的基本步骤

Hapi.js 框架提供了一个插件 hapi-boom-decorators,它能够让我们非常方便地在 Hapi.js 应用程序中实现文件上传。我们只需要按照以下步骤安装并使用该插件即可:

  1. 安装 hapi-boom-decorators 插件:

npm install hapi-boom-decorators --save

  1. 将该插件添加到 Hapi.js 应用程序中:
  1. 创建 POST 路由来接受上传文件:
-- -------------------- ---- -------
--------------
  ------- -------
  ----- ----------
  -------- -
    -------- -
      ------- ---------
      ------ -----
      ------ ---------------------
    -
  --
  -------- ----- --------- -- -- -
    ----- - ---- - - ---------------- 
    -- --------
    ------ -----------------------
  -
--

在上面的代码中,我们创建了一个 POST 路由来接受上传文件。为了支持文件上传,我们需要在 options.payload 中添加 { allow: 'multipart/form-data' } 属性,且设置 payload.output'stream' 以及 payload.parsetrue

接下来,我们可以通过 request.payload 获取上传的文件并在 handler 中进行处理。上面的代码中,我们将上传的文件存储在了 file 变量中。

至此,我们已成功实现了文件上传的基本功能。在下面的小节中,我们将讨论如何处理上传的文件并设置文件上传的参数。

如何处理上传的文件

当用户上传一个文件时,我们往往需要对该文件进行处理,例如将其保存到服务器上或者向第三方服务发送该文件。在 Hapi.js 中,我们可以通过以下方式访问上传的文件:

通过 request.payload.file.hapi,我们可以访问上传文件的相关信息,例如文件名、请求头和文件路径等。其中,path 属性包含了上传文件的本地路径,我们可以将其读取出来来处理上传文件的操作。示例如下:

我们可以通过 fs.readFileSync 方法读取文件流将文件存储到服务器上。当然,我们还需要在处理完上传文件之后将其删除,以便及时释放磁盘空间。这里提供了另一种方式,可以手动删除上传的文件。

在以上代码中,我们在服务器响应完成后,通过 fs.unlink 方法删除上传的文件。

如何设置文件上传的参数

在 Hapi.js 中,我们可以通过 payload.outputpayload.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 获取上传的文件。由于允许上传多个文件,我们需要对文件进行遍历。在文件遍历过程中,我们可以获取上传文件的相关信息 filenamepath,然后读取文件的信息 fs.readFileSync(path),并进行处理操作。最后,我们返回一个简单的响应信息表明文件上传成功。

总结

在本文中,我们详细讲解了 Hapi.js 执行文件上传的完整流程,并介绍了上传文件的基本操作、如何处理上传文件、文件上传的配置以及如何执行多个文件上传。希望在阅读完本文之后,你能够对 Hapi.js 文件上传的操作有更深入的理解。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645a256c968c7c53b0c47c9b

纠错
反馈