Node.js 使用axios下载zip,使用内存中的adm zip解压(electron应用程序)

Node.js 使用axios下载zip,使用内存中的adm zip解压(electron应用程序),node.js,axios,electron,adm-zip,Node.js,Axios,Electron,Adm Zip,我需要下载一个带有axios的文件,并在一个电子应用程序的内存中解压 我在一些SO线程()中读到,adm-zip支持字节缓冲区构造函数,但我在文档中看不到这一点。当我提取内容时,它的行为就像数组是空的,但它不是空的。它只是创建了一个文件,没有抛出任何我不想使用的错误,因为api被标记为不推荐使用。我的代码是: const axios = require("axios"); const AdmZip = require('adm-zip'); const url = &

我需要下载一个带有axios的文件,并在一个电子应用程序的内存中解压

我在一些SO线程()中读到,
adm-zip
支持字节缓冲区构造函数,但我在文档中看不到这一点。当我提取内容时,它的行为就像数组是空的,但它不是空的。它只是创建了一个文件,没有抛出任何我不想使用的错误,因为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);
我觉得自己超级愚蠢,因为我曾经让它工作过一次,然后又改变了一些东西,现在我似乎再也找不到错误了:/I遗憾的是,我没有提交工作状态

编辑: 所以,我们找到了答案:Electron做了一些奇怪的事情,返回一个数组缓冲区,而不是adm zip需要的缓冲区。由于我很懒,所以将包
arraybuffer添加到缓冲区
,现在代码可以工作了:

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实施:


它与
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();
const axios=require('axios');
const AdmZip=require('adm-zip');
常量f=async()=>{
常量url=http://update-service.test.w3champions.com/api/webui';
const body=等待axios.get(url{
响应类型:'arraybuffer',
});
var zip=新的AdmZip(body.data);
var zipEntries=zip.getEntries();
//搜索应该在那里的“index.html”
对于(变量i=0;i
拉链包含一些文件夹和文件,我想解压。我更新了另一个文件的URL以使其更清晰。上面的代码就是这样做的
zip.readAsText(zipEntries[i])
将以文本形式返回解压缩文件。它也适用于您的新url,只是它包含二进制数据,因此没有太大帮助。我只是复制了您的代码,在日志中没有看到任何内容。另外,从
adm-zip
提取所有
。不知道为什么这么难,因为文件太大,你只需要等待。所以下载之前需要时间。也许我应该补充一点,这是一个电子应用程序,但这应该没什么大不了的。它也与文件权限无关,我可以从我的应用程序在同一位置创建文本文件。它是一个数组缓冲区,至少chrome工具这么说。嘿,你说得对,我刚刚调试到它,它需要最后一个,它是一个空文件。不知何故,arraybuffer和buffer是不同的。我会调查的,如果你想复制我的结果?我认为答案最好是找到,如果它是与答案。