使用 axios 下载 zip 并在内存中使用 adm-zip 解压缩(电子应用程序)

Download zip with axios and unzip with adm-zip in memory (electron app)

我需要用 axios 下载一个文件并在电子应用程序中将其解压缩到内存中。

我在一些 SO 线程 (e.g.) 中读到 adm-zip 支持字节缓冲区构造函数,但我在文档中看不到这一点。当我提取内容时,它的行为就像数组是空的,但事实并非如此。它只是创建一个文件并且不会抛出任何我不想使用 request 的错误,因为 api 被标记为已弃用。我的代码是这样的:

const axios = require("axios");
const AdmZip = require('adm-zip');
   
const url = "http://update-service.test.w3champions.com/api/maps";
const body = await axios.get(url, {
    responseType: 'arraybuffer'
});
const data = body.data;
const zip = new AdmZip(data);
zip.extractAllTo(to, true);

我觉得超级愚蠢,因为我有一次工作然后改变了一些东西现在我似乎没有再次发现错误:/我很遗憾没有提交工作状态...

编辑: 所以,我们想通了:Electron 做了一些奇怪的事情,returns 一个数组缓冲区而不是缓冲区,adm-zip 需要。因为我很懒,所以添加了包 arraybuffer-to-buffer 现在代码可以工作了:

const arrayBufferToBuffer = window.require('arraybuffer-to-buffer');
const url = `${this.updateUrl}api/${fileName}?ptr=${this.isTest}`;
const body = await axios.get(url, {
    responseType: 'arraybuffer'
});

const buffer = arrayBufferToBuffer(body.data);
const zip = new AdmZip(buffer);
zip.extractAllTo(to, true);

检查数据类型,可能不是缓冲区。

Adm 实施:https://github.com/cthackers/adm-zip/blob/master/adm-zip.js

axios效果相同。下面的代码是一个工作示例。

const axios = require('axios');
const AdmZip = require('adm-zip');

const f = async () => {
    const url = 'http://update-service.test.w3champions.com/api/webui';
    const body = await axios.get(url, {
        responseType: 'arraybuffer',
    });

    var zip = new AdmZip(body.data);
    var zipEntries = zip.getEntries();

    // search for "index.html" which should be there
    for (var i = 0; i < zipEntries.length; i++) {
        console.log(zip.readAsText(zipEntries[i]));
    }

    // and to extract it into current working directory
    zip.extractAllTo('.', true);
};

f();