文件上传是开发 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
函数返回一个对象,包含了所有表单数据和文件信息。我们可以通过该对象的 fields
和 files
属性来分别获取表单数据和文件信息。
处理文件上传
当我们成功地解析了 multipart/form-data
主体后,我们就需要将文件写入到磁盘中。在一些简单的应用场景中,我们可以直接使用 Deno.writeFile
函数将文件写入到指定路径中。然而,在实际应用中,我们需要做更多的工作来保证服务器的稳定性和性能。
文件名
首先,我们需要确定文件的保存路径和文件名。文件名应当是唯一的,以避免不同用户上传的文件发生冲突。我们可以使用 UUID 库来生成唯一的文件名:
import { v4 } from "https://deno.land/std/uuid/mod.ts"; const fileName = `${v4.generate()}.${formData.files.avatar.type.split("/")[1]}`; const filePath = `/path/to/save/${fileName}`;
上述代码中,我们首先使用 v4.generate
函数生成一个唯一的 UUID,然后拼接上文件后缀名来形成文件名。最后,我们可以将文件保存在指定的路径中。
存储引擎
在实际应用中,我们通常会将上传的文件存储在 Amazon S3、Aliyun OSS 等云存储平台中,以提供高可用性和高可靠性的服务。我们可以使用 aws-sdk
或 ali-oss
等库来操作这些存储引擎。
以下是一个使用 Aliyun OSS 存储上传文件的例子:
-- -------------------- ---- ------- ------ - --- - ---- ------------------------------------- ----- ------ - --- ----- ------------ --------------------- ---------------- ------------------------- --------- ---------------------------- ------- ------------------- --- ----- ------ - ----- -------------------- ------------------------------- ------------------------
上述代码中,我们首先创建了一个 Aliyun OSS 客户端,然后使用 put
函数将文件写入指定的 OSS Bucket 中。该函数返回了一个包含了文件访问 URL 的对象,我们可以将该 URL 返回给客户端。
错误处理
在文件上传过程中,可能会出现各种错误,例如磁盘空间不足、网络中断等等。为了保证服务的可靠性,我们需要对这些错误进行处理。以下是一个简单的错误处理例子:
-- -------------------- ---- ------- ----- ------------- - -- - ---- - ----- -- -- -- -- --------------------------- - -------------- - ------------- ----- ----- ---- ------- --- ------ --- --------- - --- - ----- ------ - ----- -------------------- ------------------------------- ------------------------ ------------- ----- ----- --------- --- - ----- ------- - --------------------- ------------- ------- ---- ----- --------- ------ ------ --- -
上述代码中,我们首先定义了一个文件大小限制,如果上传的文件大小超过了该限制,则返回错误消息。如果上传成功,则返回成功消息。如果上传过程中出现了错误,则记录错误并返回 500 错误消息。
总结
本文介绍了如何在 Deno 中优雅地处理文件上传。我们首先学习了解析 multipart/form-data
请求主体的方法,然后讨论了文件保存和存储的一些问题。最后,我们讨论了错误处理的方法。希望读者通过本文能够在实际应用中灵活地处理文件上传问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6478423b968c7c53b0482bba