4

我需要下载一个文件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);

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

编辑:所以,我们想通了: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);
4

2 回答 2

6

它与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();
于 2020-08-06T20:28:18.460 回答
3

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

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

在此处输入图像描述

于 2020-08-06T20:27:50.617 回答