gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:54:32 27 4
gpt4 key购买 nike

我想从 Internet 下载一个 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 block 。

代码:

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,简化整个流程。

关于javascript - 如何在 NodeJs 中下载和解压缩内存中的 zip 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10359485/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com