Fastify 中如何实现文件上传和下载?

阅读时长 8 分钟读完

在现代 Web 应用程序中,文件上传和下载是必不可少的功能之一。在本文中,我们将开始探讨如何在 Fastify 中实现这些功能。如果您不熟悉 Fastify,则可以阅读快速入门指南进行学习。

文件上传

当用户需要将文件上传到我们的服务器时,我们需要在服务器接收和处理它。在 Fastify 中,可以使用 fastify-multer 插件快速轻松地实现文件上传。

安装 fastify-multer

使用 npm 包管理器安装 fastify-multer:

配置 fastify-multer

要使用 fastify-multer,可以在使用 Fastify 注册路由的地方调用 fastify-multer 函数,并将选项传递给它,如下所示:

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

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

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

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

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

在上面的代码中,我们使用 fastify-multer 函数注册了内容解析器中间件,然后在 /upload 路由处理程序中使用 request.raw 获取上传的数据,并将其保存在磁盘上。

保存上传的文件到磁盘

使用 Node.js fs.promises API 将文件保存到磁盘上,并返回上传的文件的元数据:

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

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

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

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

在上面的代码中,我们使用 Node.js 内置的 fs.promises API 将文件保存到指定的 uploads 目录中,并返回保存的文件的元数据。

流式读取请求数据

由于我们必须以适当的方式从请求数据中提取二进制数据,因此我们需要创建一个帮助程序函数从数据流中读取数据并返回 promise:

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

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

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

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

上传文件示例代码

在这个例子中,当用户上传文件时,它将被保存到服务器上的硬盘中,并且将原始文件名返回给客户端:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

文件下载

在 Fastify 中,处理文件下载相对来说比文件上传要容易一些。我们可以配置 Fastify 返回要下载的文件的元数据,然后让客户端使用这些元数据下载文件。

下载文件示例代码

在这个例子中,当用户请求下载文件时,文件将从服务器的硬盘中直接提供给客户端,让客户端决定如何处理该文件(即下载或在浏览器中查看)。以下是实现代码:

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

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

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

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

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

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

在上面的代码中,当用户请求下载文件 http://localhost:3000/download/:filename 时,服务器将从硬盘读取文件并将它直接发送到客户端。

总结

在本文中,我们演示了如何在 Fastify 中实现文件上传和下载功能。Fastify 的插件使这两个过程变得容易,同时,Node.js 的内置 API 和第三方模块让文件操作变得简单。掌握这些技术对于任何 Web 应用程序都是有意义的。

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

纠错
反馈