在 Fastify 中使用 multipart/form-data

在 Fastify 中使用 multipart/form-data

前言

在 Web 开发中,上传文件是一个很常见的需求。而 multipart/form-data 是一种常用的文件上传方式。Fastify 是一个快速、低开销、可扩展的 Node.js Web 框架,支持异步编程。本文将详细介绍在 Fastify 中使用 multipart/form-data 实现文件上传的方法。

什么是 multipart/form-data

multipart/form-data 是一种 HTTP POST 请求的数据格式。它允许在同一个请求中传输多个数据类型,包括文本、二进制数据和文件等。

multipart/form-data 格式的请求消息体由多个部分组成,每个部分之间使用 boundary 字符串分隔。每个部分包含一个 Content-Disposition 头部,指示该部分的类型,以及一个 Content-Type 头部,指示该部分的 MIME 类型。

实现文件上传

在 Fastify 中,使用 fastify-multipart 插件可以很方便地实现文件上传。fastify-multipart 是一个 Fastify 插件,它可以将 multipart/form-data 格式的请求消息体解析为一个对象,其中包含了文件和其他表单数据。

安装 fastify-multipart 插件

在使用 fastify-multipart 插件前,需要先安装它:

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

使用 fastify-multipart 插件

使用 fastify-multipart 插件很简单,只需要在 Fastify 实例上注册即可:

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

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

接下来,可以在路由处理程序中使用 request.multipart() 方法获取 multipart/form-data 格式的请求消息体。

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

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

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

在上面的代码中,request.parts() 方法返回一个异步迭代器,可以依次遍历 multipart/form-data 格式的请求消息体的每个部分。每个部分都是一个对象,包含了以下属性:

  • field: 字段名
  • filename: 文件名(如果该部分是文件)
  • encoding: 编码方式
  • mimeType: MIME 类型
  • transferEncoding: 传输编码方式(通常是 "binary")
  • headers: 头部信息
  • stream: 可读流(如果该部分是文件)

如果该部分是文本,可以通过 part.toBuffer() 方法获取文本内容。

保存文件

在获取到文件流后,可以将文件保存到本地文件系统中。可以使用 fs 模块的 createWriteStream() 方法将文件流写入到本地文件中。

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

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

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

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

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

在上面的代码中,首先判断该部分是否是文件,如果是文件,则获取文件名和上传目录,然后创建可写流,并将文件流写入到本地文件中。

示例代码

下面是一个完整的示例代码:

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

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

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

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

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

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

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

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

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

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

在以上代码中,当收到 /upload 路由的 POST 请求时,会将上传的文件保存到 uploads 目录中。如果该部分不是文件,则输出该部分的字段名和值。

总结

本文介绍了在 Fastify 中使用 multipart/form-data 实现文件上传的方法。通过使用 fastify-multipart 插件,可以很方便地解析 multipart/form-data 格式的请求消息体,从而实现文件上传功能。在实现文件上传时,需要注意文件的保存路径和文件名,以及文件流的写入。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65f17cad2b3ccec22fa2c4de