如何在NodeJs的内存中下载和解压缩zip文件?

我想从互联网上下载一个zip文件,然后将其解压缩到内存中而不保存到临时文件中。我怎样才能做到这一点?

这是我尝试过的:

var url = 'http://bdn-ak.bloomberg.com/precanned/Comdty_Calendar_Spread_Option_20120428.txt.zip';

var request = require('request'), fs = require('fs'), zlib = require('zlib');

request.get(url, function(err, res, file) {

if(err) throw err;

zlib.unzip(file, function(err, txt) {

if(err) throw err;

console.log(txt.toString()); //outputs nothing

});

});

[编辑]就像我建议的那样,我尝试使用adm-zip库,但仍然无法完成这项工作:

var ZipEntry = require('adm-zip/zipEntry');

request.get(url, function(err, res, zipFile) {

if(err) throw err;

var zip = new ZipEntry();

zip.setCompressedData(new Buffer(zipFile.toString('utf-8')));

var text = zip.getData();

console.log(text.toString()); // fails

});

回答:

您需要一个可以处理缓冲区的库。最新版本adm-zip将:

npm install adm-zip

我的解决方案使用该http.get方法,因为它返回Buffer块。

码:

var file_url = 'http://notepad-plus-plus.org/repository/7.x/7.6/npp.7.6.bin.x64.zip';

var AdmZip = require('adm-zip');

var http = require('http');

http.get(file_url, function(res) {

var data = [], dataLen = 0;

res.on('data', function(chunk) {

data.push(chunk);

dataLen += chunk.length;

}).on('end', function() {

var buf = Buffer.alloc(dataLen);

for (var i = 0, len = data.length, pos = 0; i < len; i++) {

data[i].copy(buf, pos);

pos += data[i].length;

}

var zip = new AdmZip(buf);

var zipEntries = zip.getEntries();

console.log(zipEntries.length)

for (var i = 0; i < zipEntries.length; i++) {

if (zipEntries[i].entryName.match(/readme/))

console.log(zip.readAsText(zipEntries[i]));

}

});

});

这个想法是创建一个缓冲区数组,并在最后将它们连接成一个新的缓冲区。这是因为无法调整缓冲区大小。

这是一个更简单的解决方案,它request通过encoding:

null在选项中进行设置,使用模块在缓冲区中获取响应。它还遵循重定向并自动解析http / https。

var file_url = 'https://github.com/mihaifm/linq/releases/download/3.1.1/linq.js-3.1.1.zip';

var AdmZip = require('adm-zip');

var request = require('request');

request.get({url: file_url, encoding: null}, (err, res, body) => {

var zip = new AdmZip(body);

var zipEntries = zip.getEntries();

console.log(zipEntries.length);

zipEntries.forEach((entry) => {

if (entry.entryName.match(/readme/i))

console.log(zip.readAsText(entry));

});

});

body响应的是,可以直接传递到缓冲器AdmZip,简化了整个过程。

以上是 如何在NodeJs的内存中下载和解压缩zip文件? 的全部内容, 来源链接: utcz.com/qa/431459.html

回到顶部