如何在 GraphQL 中处理图像数据

在现代 Web 开发中,图像数据是不可避免的一部分。GraphQL 是一种查询语言,用于 API 的开发,它可以让我们更加灵活地处理数据。在本文中,我们将探讨如何在 GraphQL 中处理图像数据,包括上传和处理图像数据。

前置知识

在阅读本文之前,请确保您已经熟悉以下内容:

  • 基本的 GraphQL 知识
  • 在后端处理文件上传的方法

上传图像

在 GraphQL 中上传图像文件有两种方式:Base64 编码和 FormData。

Base64 编码

Base64 编码是用于传输二进制数据的一种编码方法,将二进制数据转换成 ASCII 码表示的字符串。在 GraphQL 中,可以使用 Base64 编码来上传图像。

首先,客户端需要将图像数据转换成 Base64 字符串,然后作为参数传递给 GraphQL API。

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

这里我们定义了一个名为 uploadImage 的 mutation,它接受 datafilename 两个参数。data 参数是一个 Base64 编码的字符串,表示要上传的图像数据。filename 参数是一个字符串,表示要保存的文件名。该 mutation 返回上传成功后生成的图片 ID 以及文件名。

在服务端,我们需要解码 Base64 字符串,将其保存为文件。

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

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

上述代码将传入的 data 参数解码为二进制数据,并将其保存到 uploads 目录下,并返回上传成功后生成的图片 ID 以及文件名。

注意,Base64 编码会将原始数据增加约 33% 的大小,因此在上传大型图像时,可能会出现性能问题。

FormData

FormData 是一种用于在客户端发送表单数据的 API。在 GraphQL 中,可以使用 FormData 来上传图像。

首先,客户端需要将图像数据存储在 FormData 对象中,然后将该对象作为参数传递给 GraphQL API。

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

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

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

在服务端,我们需要使用相应的库来处理 FormData,并将其保存为文件。

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

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

上述代码使用 formidable 库来处理 FormData,然后将文件保存到 uploads 目录下,并返回上传成功后生成的图片 ID 以及文件名。

处理图像数据

在 GraphQL 中,我们可以使用相应的库来处理图像数据。

使用 sharp 处理图像

sharp 是一个高性能图像处理库,可以轻松地进行缩放、裁剪、旋转和转换操作。我们可以使用 sharp 来对上传的图像进行处理。下面是一个使用 sharp 对图像进行调整大小和剪裁的示例。

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

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

上述代码使用 sharp 对上传的图像进行缩放处理,并将处理后的图像保存为 Base64 编码的字符串。注意,在处理图像时,我们使用了 Promise,因为 sharp 的大部分操作都是异步的。另外,处理后的图像数据需要以字符串形式返回,因为 GraphQL 不支持二进制数据类型。

使用 Jimp 处理图像

Jimp 是一个功能齐全的图像处理库,支持大多数图像操作和格式。我们可以使用 Jimp 来对上传的图像进行处理。

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

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

上述代码使用 Jimp 对上传的图像进行剪裁处理,并将处理后的图像保存为 Base64 编码的字符串。需要注意的是,Jimp 对象不支持直接转换为 Base64 编码,因此我们需要使用 getBufferAsync 方法将其转换为二进制数据,然后将其编码为 Base64 字符串。

结论

在本文中,我们介绍了在 GraphQL 中处理图像数据的方法,包括上传和处理图像数据。我们使用了两种上传图像的方法:Base64 编码和 FormData。同时,我们还介绍了两个处理图像数据的库:sharpJimp。通过使用这些库,我们可以轻松地对上传的图像进行处理,使其适应不同的需要。

希望本文可以对您在 GraphQL 中处理图像数据有所帮助。

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