如何使用 GraphQL 进行文件上传

在前端开发过程中,文件上传是一个常见的需求。而 GraphQL 是一种用于 API 的查询语言和运行时环境,使用它可以更方便地管理 API,并且支持对多个资源的复杂查询。本文将介绍如何使用 GraphQL 进行文件上传,并提供基于 Node.js 的示例代码。

GraphQL 对文件上传的支持

在 GraphQL 中,文件上传并不是一个内置的功能。GraphQL 建议使用外部库或插件来处理文件上传。常见的解决方案是使用 apollo-upload-servergraphql-upload 等库或插件。这些库或插件都提供了方便的解决方案,使得在 GraphQL 中处理文件上传变得容易。

如何使用 apollo-upload-server

在本文中,我们将介绍如何使用 apollo-upload-server 进行文件上传。apollo-upload-server 是一个 GraphQL 上传插件,它通过 GraphQL multipart request specification 提供了文件上传功能。

首先,我们需要依赖两个库:apollo-server-expressapollo-upload-server。你可以使用 NPM 进行安装:

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

然后,我们需要在 Express 应用中启用文件上传功能。以下是一个简单的示例,它使用 graphqlUploadExpress 中间件启用上传处理:

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

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

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

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

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

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

在这个示例中,graphqlUploadExpress 中间件用于启用上传处理。请注意,我们将上传选项设置为 false,这意味着文件上传将启用。你可以通过将 uploads 设为 true 来禁用文件上传功能。

下一步是在 GraphQL Schema 中定义上传类型。以下是一个包含上传类型的 Schema 示例:

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

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

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

在这个示例中,我们定义了一个 File 类型,它包含文件名、MIME 类型、编码类型和文件的 URL。我们还定义了一个 Mutation 类型,它包含一个上传文件的方法 uploadFile。为了支持文件上传,我们定义了 file 参数的类型为 Upload,即 GraphQL multipart request specification 中提供的上传类型。

最后,我们需要在 Mutation Resolver 中处理文件上传并将文件信息返回给客户端。以下是一个解决方案:

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

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

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

在这个示例中,我们首先获取上传文件的流和文件信息,然后将流写入到磁盘上,最后将文件信息返回给客户端。

文件上传的 Web 界面

完成了上述的配置和代码,我们会发现文件上传已经支持,但我们还需要为用户提供界面进行交互上传操作,以下是基于 React 的示例代码:

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

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

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

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

在这个示例中,我们使用 Upload 组件提供文件上传的 Web 界面,并使用 useMutation 钩子发送上传请求。在上传成功时,我们会给用户反馈。此外,我们还使用了 Ant Design 的 UploadOutlined 图标。

总结

本文介绍了如何使用 apollo-upload-server 和 GraphQL 完成文件上传,并提供了基于 Node.js 的示例代码。处理文件上传是一项常见的任务,这里所介绍的解决方案可以帮助我们简化开发工作,提高效率。同时,GraphQL 的查询语言和运行时环境也让我们可以更方便地管理 API 和复杂的查询。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6530db4c7d4982a6eb26c2d4


猜你喜欢

相关推荐

    暂无文章