如何解压缩文件并在 Node.js 中将其作为响应发送?
How can I ungzip a file and send it in response in Node.js?
我有一个端点,我只按文件名提供文件。该文件为 .gz 格式,因此我必须在发送响应之前将其解压缩。
这是部分代码:
const unzip = zlib.createGunzip();
const rs = fs.createReadStream(filePath);
rs.pipe(unzip).pipe(response);
使用这段代码,我在浏览器中获取文件的大小,但它没有开始下载,在服务器上重复 GET 请求并最终抛出错误。
如果我删除 .pipe(unzip)
并将其保留为 rs.pipe(response)
,它会提供文件但(显然)已解压缩。
能否请你指出我做错了什么。
你的问题中 response
是什么类型的 object/stream?如果是原生节点http.ServerResponse
, you'll still need to write the HTTP headers first, perhaps with response.writeHead
.
zlib 文档页面中有一个 official example(虽然是相反的,压缩 HTTP 响应而不是解压缩它)。它使用节点流 API 中的 pipeline
函数,而不仅仅是 .pipe
,但它应该为您提供一个很好的模型来遵循。请参阅底部附近的服务器位 writeHead
,然后是 pipeline
:
/* ... */ {
response.writeHead(200, { /* whatever headers you need here */ });
pipeline(raw, zlib.createGzip(), response, onError);
}
这有帮助吗?
我有一个端点,我只按文件名提供文件。该文件为 .gz 格式,因此我必须在发送响应之前将其解压缩。
这是部分代码:
const unzip = zlib.createGunzip();
const rs = fs.createReadStream(filePath);
rs.pipe(unzip).pipe(response);
使用这段代码,我在浏览器中获取文件的大小,但它没有开始下载,在服务器上重复 GET 请求并最终抛出错误。
如果我删除 .pipe(unzip)
并将其保留为 rs.pipe(response)
,它会提供文件但(显然)已解压缩。
能否请你指出我做错了什么。
你的问题中 response
是什么类型的 object/stream?如果是原生节点http.ServerResponse
, you'll still need to write the HTTP headers first, perhaps with response.writeHead
.
zlib 文档页面中有一个 official example(虽然是相反的,压缩 HTTP 响应而不是解压缩它)。它使用节点流 API 中的 pipeline
函数,而不仅仅是 .pipe
,但它应该为您提供一个很好的模型来遵循。请参阅底部附近的服务器位 writeHead
,然后是 pipeline
:
/* ... */ {
response.writeHead(200, { /* whatever headers you need here */ });
pipeline(raw, zlib.createGzip(), response, onError);
}
这有帮助吗?