npm包“express-send-stream”是用于向Node.js Express应用程序响应发送大文件的中间件。
当我们需要从服务器提供大文件时, 直接将文件作为响应发送进行传输,会导致内存耗尽或服务器挂掉。这时,我们就需要使用流stream技术或分片发送的方法来减少内存占用。
Express-send-stream使用了流stream技术,让应用程序减少内存使用,并将文件内容作为流提供给响应。此外,它还可以轻松地将Gzip压缩、文件名、文件类型、文件缓存头和自定义头等信息添加到响应。
这篇文章将会介绍npm包"express-send-stream"的主要功能,讨论一些使用它的例子,并提供代码示例和教程。
安装 express-send-stream
要使用express-send-stream npm包,先安装它。可以在终端中使用npm安装器进行安装,命令如下:
npm install express-send-stream --save
当应用中需要使用这个包时,可以在文件顶部导入,如下所示:
const express = require('express'); const sendStream = require('express-send-stream'); const app = express();
express-send-stream基本用法
一旦安装和导入express-send-stream,就可以将一个文件流作为响应发送给客户端。
app.get('/example', (req, res) => { const filePath = '~/example.mp4'; const options = {}; res.sendFile(filePath, options, (err) => { err && console.log(err); }); });
在上面的代码中,我们将文件名和options对象传递给res.sendFile() . 在options中,我们可以为响应添加Gzip压缩,缓存和头信息。如果指定了Gzip压缩,则会自动压缩文件。下面是options的示例:
-- -------------------- ---- ------- ----- ------- - - ----- --------------------------- -------- - -------- ----- -- --------- --------- ----- ------ ------------- ------ ------------- ------ ------- -- ---------- ------ ----- ---- --
使用express-send-stream发送大文件
如果要发送大文件,则需要使用express-send-stream的stream方式。
-- -------------------- ---- ------- ------------------- ----- ---- -- - ----- -------- - ---------------- ----- -------- - ------------------------------ ----- ------- - - -------- - ---------------------- ------------- -------------- - ----------- -- ------- ------ --------- ------- ----- ---- -- --------------- --------- -------- ----- -- - --- -- ----------------- --- ---
在上面的代码中,我们创建一个可读流并将其传递给sendStream。express-send-stream将从流读取文件并将其发送给客户端。
为express-send-stream添加请求头
使用express-send-stream可以轻松地添加请求头,帮助您更好地控制响应。
-- -------------------- ---- ------- ------------------- ----- ---- -- - ----- -------- - ---------------- ----- -------- - ------------------------------ ----- ------- - - -------- - ---------------------- ------------- -------------- - ----------- -- ------- ------ --------- ------- ----- ---- -- --------------- --------- -------- ----- -- - --- -- ----------------- --- ---
要添加请求头,您只需将键和值添加到对象中,该对象将作为options中的headers字段。例如,我们添加Content-Type和Content-Disposition请求头,如上所示。
让请求url和文件名相匹配
在客户端的浏览器中,如果URL和文件名不一致,该文件将不会从服务器下载。但是,在Node.js中使用Express时,可以使用res.download() :res.download(filepath [, filename] [, callback])
,它将下载指定的文件。
app.get('/example', (req, res) => { res.download('/path/to/file.zip', 'example.zip', (err) => { if (err) {console.log(err);} else {console.log('Sent file successfully');} }); });
在客户端通过点击链接来请求此路由,如果url中的文件名不同于'example.zip',则浏览器会调用该文件,但是会响应错误。
为了解决这个问题,我们可以使用express-send-stream发送文件,并在URL和文件名之间建立对应关系,以避免误解。
-- -------------------- ---- ------- ------------------------- ----- ---- -- - ----- -------- - ------------------ -- -------------- ----- -------- - ----------------------- ----- -------- - ------------------------------ ----- ------- - - -------- - ---------------------- ------------ ---------------------- -------------- - ----------------- -- ------- ------ --------- ------- ----- ---- -- --------------- --------- -------- ----- -- - --- -- ----------------- --- ---
在上面的代码中,我们指定了路由中的参数以表示文件名,因此能够通过const fileName = req.params['name'] || 'example.zip';
来捕获文件名。然后,我们将其用于Content-Disposition header 中。
总结
express-send-stream是Express应用程序中发送大文件的好方法,因为它使用了流stream技术,支持轻松Gzip压缩、文件名、文件类型、文件缓存头和自定义头等。它可以让您更好地控制响应,并防止内存泄漏和服务器挂掉。
访问官方文档以获得更多信息和例子示意。
参考资料: express-send-stream documentation express sendfile vs streams Node.js Streams - Everything you need to know
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600551b081e8991b448cf0f7