如何解压缩文件并在 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);
  }

这有帮助吗?