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

Sim*_*s0n 5 node.js adm-zip electron axios

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

我读了一些支持字节缓冲区构造函数的SO线程(例如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);
Run Code Online (Sandbox Code Playgroud)

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

编辑:所以,我们想通了:Electron 做了一些奇怪的事情,返回一个数组缓冲区而不是 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);
Run Code Online (Sandbox Code Playgroud)

Mat*_*ava 9

它的工作原理与 相同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();
Run Code Online (Sandbox Code Playgroud)


小智 3

检查数据的类型,也许它不是缓冲区。

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

在此输入图像描述