Загрузите zip с помощью ax ios и разархивируйте с помощью adm-zip в памяти (электронное приложение) - PullRequest
0 голосов
/ 06 августа 2020

Мне нужно загрузить файл с 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);

Я чувствую себя супер глупо, потому что однажды он работал, а затем что-то изменил, и теперь, похоже, я больше не нахожу ошибку: / К сожалению, я не зафиксировал рабочий state ...

edit: Итак, мы разобрались: 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);

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Работает так же с 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();
1 голос
/ 06 августа 2020

проверьте тип данных, возможно, это не буфер.

Реализация Adm: https://github.com/cthackers/adm-zip/blob/master/adm-zip.js

введите описание изображения здесь

...