传输文件是 Web 应用程序的常见需求。在前后端分离的情况下,实现上传和下载需求需要后端提供相应接口。而 Hapi.js 是一个使用 Node.js 构建 Web 服务器的框架,它提供了丰富的功能和插件,使得实现文件上传和下载变得轻松而简单。本文将详细介绍如何在 Hapi.js 中实现文件上传和下载。
上传文件
建立路由
在实现文件上传时,我们需要将客户端请求中的文件传输至服务器端。为此,我们需要建立一个上传文件的路由,接收客户端传递的文件。以下是一个简单的上传文件路由示例:
-- -------------------- ---- ------- -------------- ------- ------- ----- ---------- -------- ----- --------- -- -- - ----- ---- - ---------------- -- ----------- - ----- ---- - ------------------------ ----- ---- - --------- - ----------- - ----- ----- ---- - --------------------------- ---------------- ----- -- -------------------- --------------------- ------ ----- -------- -------------- - ------ -------------- ---- ---------------------- -- -------- - -------- - --------- --------- ------- --------- ------ ----- ------ --------------------- - - ---
以上代码中,我们定义了一个 POST 请求的路由,路径为 /upload
,当客户端发送一个带有文件的 POST 请求时,服务器将执行该路由。该路由主要包括如下三个步骤:
解析客户端请求的文件,并且将文件存储到服务器端的某个路径中。在上述示例中,我们使用了
fs.createWriteStream()
方法将文件写入到服务器端的/uploads
目录中;检查客户端请求中是否带有文件,如果没有文件,则返回错误信息;
如果文件上传成功,则返回一个成功信息。
需要注意,在定义该路由时,我们使用了 options
属性,用于配置该路由的参数。其中,payload
参数用于定义如何解析客户端请求中的 payload
数据。在实现文件上传时,我们需要启用 multipart/form-data
的数据类型,并且将其作为 allow
参数传递。同时,我们还需要使用 parse
参数将 payload
对象解析为一个可读流(stream
)对象。最后,我们还需要对上传的文件大小进行限制,可以通过 maxBytes
参数来实现。在上述示例中,我们将最大文件限制设置为 10MB(即 10485760 字节)。
测试上传
接下来,我们需要编写一个客户端脚本,用于向服务器上传文件。下面是一个简单的示例脚本,用于向 /upload
路由上传文件:
-- -------------------- ---- ------- --------- ----- ----- ---------- ------ ----- ---------------- ----------- ------ --------------- ------- ------ ----- ----------------------------- ------------- ----------------- ------ ----------- ------------ ----------------------- ------- ------- -------
在启动服务器之后,我们可以打开该示例页面,选择一份文件,并且点击 Upload
按钮,可将文件上传至服务器中。在上传完毕后,服务器将返回“File uploaded successfully”消息。
下载文件
建立路由
在 Hapi.js 中,实现下载文件也很容易,我们只需要在服务器端建立一个下载文件的路由,通过向客户端发送文件来实现下载功能。以下是一个简单的下载文件路由示例:
-- -------------------- ---- ------- -------------- ------- ------ ----- ------------ -------- --------- -- -- - ----- -------- - --------- - --------------- ----- ---- - ------------------------------ ----- -------- - ----------------- --------------------------------- -------------------------------------- ------------ ----------------------- --------------------------------- ---------------------------- ------ --------- - ---
以上示例中,我们定义了一个 GET 请求的路由,路径为 /download
,当客户端发送一个 GET 请求时,服务器将执行该路由。在该路由中,我们首先定义了一个文件路径 constant,在本示例中我们下载的文件路径为 /example.pdf
。接下来,我们使用 createReadStream()
方法创建读取流,用于读取服务器端目标文件。我们接着使用 Hapi.js 的 response
方法来返回文件内容至客户端。当然,在声明 Hapi.js 的 response
对象时,我们还需要设置一些属性值,以便客户端按照正确的方式下载文件。
response.type('application/pdf')
:设置下载文件的 MIME 类型;response.header('Content-Disposition', 'attachment; filename=example.pdf')
:设置文件下载时的文件名,并将其作为一个附件下载;response.header('Content-Length', fs.statSync(filePath).size)
:设置文件的大小。
测试下载
在启动服务器之后,我们可以使用浏览器访问 /download
路由,可以看到服务器成功返回了一个 .pdf
的文件,并且浏览器自动弹出下载框。
总结
通过本文,我们学习了如何使用 Hapi.js 框架实现文件的上传和下载功能。在本文的示例中,我们主要使用了 fs
和 stream
等核心 Node.js 模块,以及 Hapi.js 的 payload
和 response
等方法。当然,Hapi.js 还提供更多丰富的功能和插件,如 Boom
、Joi
、Hapi-auth-jwt2
等等,可以让我们更加高效地构建 Web 应用程序。希望本文能为 Hapi.js 开发者带来一些帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6521460795b1f8cacd8cb1e4