您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

您需要一个可以处理缓冲区的库。最新版本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,简化了整个过程。

Node 2022/1/1 18:21:13 有628人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶