如何在 Deno 中优雅地处理文件上传?

阅读时长 6 分钟读完

文件上传是开发 Web 应用非常常见的需求。在 Deno 中,我们可以使用官方提供的 std/http 模块来处理 HTTP 请求和响应。然而,该模块对文件上传的支持并不完善,本文将介绍如何在 Deno 中优雅地处理文件上传。

multipart/form-data

当浏览器发送包含文件的 POST 请求时,请求头中的 Content-Type 通常为 multipart/form-data。该类型的请求主体是由多个部分组成的,每个部分都包含了一个唯一的边界字符串。我们可以通过解析该请求主体来获取表单数据和文件信息。

解析 multipart/form-data

在 Deno 中,使用 std/multipart 模块可以方便地解析 multipart/form-data 主体。

以下是一个简单的例子,展示如何解析包含一个 avatar 文件和一个 name 字段的 POST 请求:

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

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

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

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

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

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

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

上述代码中,我们首先通过 parseFormData 函数解析请求主体。parseFormData 函数返回一个对象,包含了所有表单数据和文件信息。我们可以通过该对象的 fieldsfiles 属性来分别获取表单数据和文件信息。

处理文件上传

当我们成功地解析了 multipart/form-data 主体后,我们就需要将文件写入到磁盘中。在一些简单的应用场景中,我们可以直接使用 Deno.writeFile 函数将文件写入到指定路径中。然而,在实际应用中,我们需要做更多的工作来保证服务器的稳定性和性能。

文件名

首先,我们需要确定文件的保存路径和文件名。文件名应当是唯一的,以避免不同用户上传的文件发生冲突。我们可以使用 UUID 库来生成唯一的文件名:

上述代码中,我们首先使用 v4.generate 函数生成一个唯一的 UUID,然后拼接上文件后缀名来形成文件名。最后,我们可以将文件保存在指定的路径中。

存储引擎

在实际应用中,我们通常会将上传的文件存储在 Amazon S3、Aliyun OSS 等云存储平台中,以提供高可用性和高可靠性的服务。我们可以使用 aws-sdkali-oss 等库来操作这些存储引擎。

以下是一个使用 Aliyun OSS 存储上传文件的例子:

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

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

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

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

上述代码中,我们首先创建了一个 Aliyun OSS 客户端,然后使用 put 函数将文件写入指定的 OSS Bucket 中。该函数返回了一个包含了文件访问 URL 的对象,我们可以将该 URL 返回给客户端。

错误处理

在文件上传过程中,可能会出现各种错误,例如磁盘空间不足、网络中断等等。为了保证服务的可靠性,我们需要对这些错误进行处理。以下是一个简单的错误处理例子:

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

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

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

上述代码中,我们首先定义了一个文件大小限制,如果上传的文件大小超过了该限制,则返回错误消息。如果上传成功,则返回成功消息。如果上传过程中出现了错误,则记录错误并返回 500 错误消息。

总结

本文介绍了如何在 Deno 中优雅地处理文件上传。我们首先学习了解析 multipart/form-data 请求主体的方法,然后讨论了文件保存和存储的一些问题。最后,我们讨论了错误处理的方法。希望读者通过本文能够在实际应用中灵活地处理文件上传问题。

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

纠错
反馈