前言
随着互联网的快速发展,大量的应用和网站都需要处理文件上传的需求,如头像、图片、音频等等。而 Node.js 生态圈中的 Hapi 框架,是一个强大的开发工具,对于文件上传的处理也提供了丰富的解决方案。
本文将简要介绍 Hapi 框架中如何处理文件上传,包括如何设置路由、如何获取上传文件、如何处理上传文件、以及如何使用插件增强文件上传功能。希望本文可以为前端开发者提供一些参考和指导。
设置路由
在 Hapi 框架中,文件上传的处理是通过路由来完成的。首先需要设置一个路由来接收客户端上传的文件。
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ------ - --- ------------- ----- ----- ----- ------------ --- -------------- ------- ------- ----- ---------- -------- - -------- - --------- ---- - ---- - --- -- ------------- ------- --------- ------ ----- ------ ---------------------- -- ---- ------------------- ----- -- -------- ----- --------- -- -- - -- ---------- ------ ------- -- -- ---
如上述代码所示,使用 server.route
方法设置了一个路由,其中 method
为 POST
,path
为 /upload
。
同时,为了能够正确处理上传的文件,需要使用 options.payload
选项来设置请求有效负载。
maxBytes
选项限制上传大小,避免过度消耗服务器资源。output: 'stream'
选项告诉 Hapi 框架将文件内容以流的形式传输。parse: true
选项让 Hapi 框架自动解析客户端上传的数据。allow: 'multipart/form-data'
选项允许上传multipart/form-data
类型的数据。
请注意,这里的 handler
函数只是一个示例,实际上需要对上传的文件进行处理。下一节将介绍如何获取上传的文件。
获取上传的文件
由于设置了 parse: true
选项,Hapi 框架会自动解析客户端上传的数据,并将解析后的数据存储在 request.payload
对象中。
在处理上传的文件时,需要首先获取上传的文件并进行处理。
-- -------------------- ---- ------- -------- ----- --------- -- -- - ----- - ---- - - ---------------- ----- -------- - ------------------- ----- ---- - ----------- -- -------- -- ------- ---------------------- ------ ------- --
如上述代码所示,首先从 request.payload
对象中取出上传的文件,再从文件对象中获取文件名和二进制数据,然后对文件进行处理。在这里只是简单地将文件名输出到控制台。
需要注意的是,request.payload
对象中的属性名与客户端表单提交的 name 值是对应的。如果客户端上传的表单中输入框的 name 值为 avatar
,那么在处理请求时可以通过 request.payload.avatar
来获取上传的文件。
处理上传的文件
一般来说,处理上传的文件的方式是将其保存到服务器本地的某个目录中。这需要用到 Node.js 内置的文件系统模块 fs
。
-- -------------------- ---- ------- ----- -- - -------------- ----- ---- - ---------------- -------- ----- --------- -- -- - ----- - ---- - - ---------------- ----- --- - ----------------------- -------------- -- --------- ----- -------- - ------------------- ----- -------- - --------------------- -- ---------------- ----- ---------- - ------------------------------- ---------------------- ----- -- -------------------- ---------------------- ------ ------- --
如上述代码所示,首先定义了一个保存上传文件的目录,然后将其保存到本地。
需要注意的是,Hapi 框架将上传的文件作为二进制流进行传输,因此在保存文件时需要使用 fs.createWriteStream
方法创建一个文件写入流,并将二进制数据写入到指定的文件中。在这里使用了 data.pipe(fileStream)
来完成文件写入操作。
当然,还需要考虑一些文件操作中的边界问题,例如文件目录是否存在,文件名是否重复,文件流是否出错等等。
使用插件增强文件上传功能
除了以上的方法,Hapi 框架还提供了大量的插件,可以让文件上传更加方便、高效。
多数情况下,使用 hapi-payload-raw
插件可以直接获取上传的二进制数据,并由 Hapi 框架负责文件的存储。
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ---------- - ---------------------------- ----- ------ - --- ------------- ----- ----- ----- ------------ --- ----- -------- ------ - -- -- ------- --- -- ----- ---------------------------- -------------- ------- ------- ----- ---------- -------- - -------- - --------- ---- - ---- - --- ------- --------- ------ ------ ------ ---------------------- ---- ----- -- --- ---------------- ----------------------- --- -- -------- ----- --------- -- -- - ----- -------- - ------------------------------ ----- ---- - ------------------------ ----- --- - ----------------------- -------------- ----- -------- - --------------------- -- ---------------- ----- ---------- - ------------------------------- ---------------------- ----- -- -------------------- ---------------------- ------ ------- -- -- --- ----- --------------- - -------
如上述代码所示,首先使用 await server.register(PayloadRaw)
注册了 payload-raw
插件,然后设置了 raw: true
选项,让上传的数据全部保存到 request.payload.rawData
属性中,并且不需要再使用 request.payload
对象。
最后,还需要注意从请求头中获取文件名的方法。Hapi 框架默认将文件名保存在请求头的 x-filename
属性中,因此可以通过 request.headers['x-filename']
来获取它。
总结
在本文中,我们介绍了 Hapi 框架中如何处理文件上传的基本步骤,即设置路由、获取上传的文件、处理上传的文件等。同时,还介绍了如何使用插件增强文件上传功能。
希望这些内容可以对前端开发者有所帮助,对于 Hapi 框架的初学者来说也能够有所收获。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/654d6f577d4982a6eb6ce6fd