我正在使用node的sitemap模块,该模块为我的网站生成一个带有sitemap xml的字符串。由于这是一个非常大的站点地图,我想将其压缩发送(例如,作为sitemap.xml.gz)。但是,zlib模块没有压缩它。它可以工作,如果我将它流式传输到服务器中的文件,然后使用此文件来压缩它,但我希望能够直接压缩生成的xml字符串。 这就是我在做的事情:
res.header('Content-Type', 'application/x-gzip');
res.header('Content-Encoding', 'gzip');
res.header('ContentDisposition',
'attachment;filename="sitemap.xml.gzip"');
//testString is used here as an example, the generated sitemap xml will go here
var testString = '<?xml version="1.0" encoding="UTF-8"?>';
var input = Buffer.from(testString, 'utf8');
zlib.gzip(input, function(buferror, data) {
res.send(data);
});
我也尝试过使用流模块缓冲字符串,并将其通过管道,如下所示:
var s = new stream.Readable();
s._read = function noop() {};
s.push(testString);
s.push(null);
s.pipe(zlib.createGzip()).pipe(res);
但是,我仍然得到相同的结果,一个不压缩的sitemap.xml.gzip文件。正如我所提到的,如果我将生成的xml字符串放入服务器中的文件中,并且像这样管道它,我能够使它工作:
var raw = fs.createReadStream('input.txt.gz');
raw.pipe(zlib.createGzip()).pipe(res);
但我想避免这种解决方法。谁能解释我做错了什么?提前致谢!
答案 0 :(得分:0)
当您使用Content-Encoding: gzip
时,您允许浏览器自动解码(/ gunzip)响应内容。
如果您不想这样做,请不要设置该标头(同样,您的ContentDisposition
标头错过了连字符,它应该是Content-Disposition
)。