Hapi 框架中如何处理文件上传

阅读时长 7 分钟读完

前言

随着互联网的快速发展,大量的应用和网站都需要处理文件上传的需求,如头像、图片、音频等等。而 Node.js 生态圈中的 Hapi 框架,是一个强大的开发工具,对于文件上传的处理也提供了丰富的解决方案。

本文将简要介绍 Hapi 框架中如何处理文件上传,包括如何设置路由、如何获取上传文件、如何处理上传文件、以及如何使用插件增强文件上传功能。希望本文可以为前端开发者提供一些参考和指导。

设置路由

在 Hapi 框架中,文件上传的处理是通过路由来完成的。首先需要设置一个路由来接收客户端上传的文件。

-- -------------------- ---- -------
----- ---- - ----------------------
----- ------ - --- -------------
  ----- -----
  ----- ------------
---

--------------
  ------- -------
  ----- ----------
  -------- -
    -------- -
      --------- ---- - ---- - --- -- -------------
      ------- ---------
      ------ -----
      ------ ---------------------- -- ---- ------------------- -----
    --
    -------- ----- --------- -- -- -
      -- ----------
      ------ -------
    --
  --
---

如上述代码所示,使用 server.route 方法设置了一个路由,其中 methodPOSTpath/upload

同时,为了能够正确处理上传的文件,需要使用 options.payload 选项来设置请求有效负载。

  • maxBytes 选项限制上传大小,避免过度消耗服务器资源。
  • output: 'stream' 选项告诉 Hapi 框架将文件内容以流的形式传输。
  • parse: true 选项让 Hapi 框架自动解析客户端上传的数据。
  • allow: 'multipart/form-data' 选项允许上传 multipart/form-data 类型的数据。

请注意,这里的 handler 函数只是一个示例,实际上需要对上传的文件进行处理。下一节将介绍如何获取上传的文件。

获取上传的文件

由于设置了 parse: true 选项,Hapi 框架会自动解析客户端上传的数据,并将解析后的数据存储在 request.payload 对象中。

在处理上传的文件时,需要首先获取上传的文件并进行处理。

-- -------------------- ---- -------
-------- ----- --------- -- -- -
  ----- - ---- - - ----------------
  ----- -------- - -------------------
  ----- ---- - ----------- -- --------

  -- -------
  ----------------------

  ------ -------
--

如上述代码所示,首先从 request.payload 对象中取出上传的文件,再从文件对象中获取文件名和二进制数据,然后对文件进行处理。在这里只是简单地将文件名输出到控制台。

需要注意的是,request.payload 对象中的属性名与客户端表单提交的 name 值是对应的。如果客户端上传的表单中输入框的 name 值为 avatar,那么在处理请求时可以通过 request.payload.avatar 来获取上传的文件。

处理上传的文件

一般来说,处理上传的文件的方式是将其保存到服务器本地的某个目录中。这需要用到 Node.js 内置的文件系统模块 fs

-- -------------------- ---- -------
----- -- - --------------
----- ---- - ----------------

-------- ----- --------- -- -- -
  ----- - ---- - - ----------------
  ----- --- - ----------------------- -------------- -- ---------
  ----- -------- - -------------------
  ----- -------- - ---------------------

  -- ----------------
  ----- ---------- - -------------------------------
  ---------------------- ----- -- --------------------
  ----------------------

  ------ -------
--

如上述代码所示,首先定义了一个保存上传文件的目录,然后将其保存到本地。

需要注意的是,Hapi 框架将上传的文件作为二进制流进行传输,因此在保存文件时需要使用 fs.createWriteStream 方法创建一个文件写入流,并将二进制数据写入到指定的文件中。在这里使用了 data.pipe(fileStream) 来完成文件写入操作。

当然,还需要考虑一些文件操作中的边界问题,例如文件目录是否存在,文件名是否重复,文件流是否出错等等。

使用插件增强文件上传功能

除了以上的方法,Hapi 框架还提供了大量的插件,可以让文件上传更加方便、高效。

多数情况下,使用 hapi-payload-raw 插件可以直接获取上传的二进制数据,并由 Hapi 框架负责文件的存储。

-- -------------------- ---- -------
----- ---- - ----------------------
----- ---------- - ----------------------------
----- ------ - --- -------------
  ----- -----
  ----- ------------
---

----- -------- ------ -
  -- -- ------- --- --
  ----- ----------------------------

  --------------
    ------- -------
    ----- ----------
    -------- -
      -------- -
        --------- ---- - ---- - ---
        ------- ---------
        ------ ------
        ------ ----------------------
        ---- ----- -- --- ---------------- ----------------------- ---
      --
      -------- ----- --------- -- -- -
        ----- -------- - ------------------------------
        ----- ---- - ------------------------

        ----- --- - ----------------------- --------------
        ----- -------- - ---------------------

        -- ----------------
        ----- ---------- - -------------------------------
        ---------------------- ----- -- --------------------
        ----------------------

        ------ -------
      --
    --
  ---

  ----- ---------------
-

-------

如上述代码所示,首先使用 await server.register(PayloadRaw) 注册了 payload-raw 插件,然后设置了 raw: true 选项,让上传的数据全部保存到 request.payload.rawData 属性中,并且不需要再使用 request.payload 对象。

最后,还需要注意从请求头中获取文件名的方法。Hapi 框架默认将文件名保存在请求头的 x-filename 属性中,因此可以通过 request.headers['x-filename'] 来获取它。

总结

在本文中,我们介绍了 Hapi 框架中如何处理文件上传的基本步骤,即设置路由、获取上传的文件、处理上传的文件等。同时,还介绍了如何使用插件增强文件上传功能。

希望这些内容可以对前端开发者有所帮助,对于 Hapi 框架的初学者来说也能够有所收获。

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

纠错
反馈