我有一个端点,在那里我只按文件名提供文件。该文件有.gz格式,所以我必须在发送响应之前将其解压缩。
这是代码的一部分:
const unzip = zlib.createGunzip();
const rs = fs.createReadStream(filePath);
rs.pipe(unzip).pipe(response);
使用这段代码,我在浏览器中获取文件的大小,但它没有开始下载,在服务器上重复GET请求,最终抛出错误。
如果我删除.pipe(unzip)
并将其保留为rs.pipe(response)
,它将为文件提供服务,但(显然(已解压缩。
你能指出我做错了什么吗。
您的问题中response
是什么类型的对象/流?如果它是本机节点http.ServerResponse
,那么您仍然需要首先编写HTTP头,也许使用response.writeHead
。
zlib文档页面中有一个官方示例(尽管相反,压缩HTTP响应而不是解压缩(。它使用节点流API中的pipeline
函数,而不仅仅是.pipe
,但它应该为您提供一个良好的模型。请参阅底部附近的服务器位以获取writeHead
,然后是pipeline
:
/* ... */ {
response.writeHead(200, { /* whatever headers you need here */ });
pipeline(raw, zlib.createGzip(), response, onError);
}
这有帮助吗?