我正在我的本地Node.js
服务器上下载this AWS S3 object -
var url = "http://s3.amazonaws.com/cloudfront.s3post.cf/s3posts.json.gz";
var dest = "./s3posts.json.gz";
var download = function(url, dest, cb) {
var file = fs.createWriteStream(dest);
var request = http.get(url, function(response) {
response.pipe(file);
file.on('finish', function() {
file.close(cb);
});
});
}
download(url, dest, function() {
console.log('Download complete');
});
这会成功下载.json.gz
个对象。我正在尝试使用zlib
-
var gunzip = zlib.createGunzip();
var rstream = fs.createReadStream('./s3posts.json.gz');
var wstream = fs.createWriteStream('./s3posts.json');
rstream.pipe(gunzip).pipe(wstream);
但是,这会引发错误,并且创建的.json
文件为空 -
events.js:163
throw er; // Unhandled 'error' event
^
Error: unexpected end of file
at Zlib._handle.onerror (zlib.js:355:17)
奇怪的是,如果我只使用下载代码下载对象并使用终端上的gunzip s3posts.json.gz
手动解压缩,则创建的json文件中会填充内容,我可以成功运行我的应用程序。
我不确定为什么我能够手动解压缩但无法使用zlib
以编程方式执行此操作。如果有人能指出我是否犯了错误,那将是非常有帮助的。
如果相关的话,S3对象具有以下元数据 -
Cache-Control: max-age=31536000,no-transform,public
Content-Encoding: gzip
Content-Type: application/json
答案 0 :(得分:0)
当您下载gzip压缩文件时,您没有检查错误,因此您最终保存了一个空文件。然后你尝试解压缩空文件,你得到一个错误,这也是未处理的,你的程序崩溃了。
只需处理所有错误,您就知道出了什么问题。从您的示例中,除了.gz文件可能是空的之外,不可能告诉您任何内容,因为下载显然出现了问题。但是想要完全出错是一个谜,因为你没有检查代码中的错误。
答案 1 :(得分:0)
事实证明,在解压缩之前我还没有等待文件完成下载;这就是生成的json
为空的原因。我不得不使用代码将文件解压缩为回调函数 -
download(url, dest, function() {
console.log('Download complete');
var gunzip = zlib.createGunzip();
var rstream = fs.createReadStream('./s3posts.json.gz');
var wstream = fs.createWriteStream('./s3posts.json');
rstream.pipe(gunzip).pipe(wstream);
});
这也解释了为什么我只能使用下载代码手动解压缩文件,因为此时下载已完成,允许我在终端上成功解压缩。