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)
它的工作原理与 相同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)
| 归档时间: |
|
| 查看次数: |
9854 次 |
| 最近记录: |