我想用JSZip下载和解压缩文件夹,我使用此npm软件包安装了它。JSZip无法这样做,抱怨zip损坏或签名意外。
与jszip有关的问题很多。他们中没有一个回答我的特定问题,但是出于完整性考虑,我在此处列出了一些参考:
作为测试方案,我创建了两个zip文件,分别称为folder.zip
和text.zip
。text.zip
是压缩的txt文件,folder.zip
是压缩的文件夹,包含txt文件。在Ubuntu中,两者都已通过命令行压缩。
我使用npm包serve托管它们。它们可以在本地主机上访问:http://localhost:5000/test.zip
这是我的代码,是打字稿,已编译的Javascript是使用node执行的:
import axios from 'axios';
import * as JSZip from 'jszip';
axios.get(
"http://localhost:5000/text.zip",
//"http://localhost:5000/folder.zip",
{ responseType: "blob" })
.then((response) => {
let zip = new JSZip();
zip.loadAsync(response.data).then((value) => {
console.log('jszip unzipped response.data');
value.forEach((path, file) => {
console.log(path);
})
}).catch((e) => {
console.log(`jszip failed on response.data: ${e}`);
})
let buffer = Buffer.from(response.data, 'binary');
zip.loadAsync(buffer).then((value) => {
console.log('jszip unzipped buffer');
value.forEach((path, file) => {
console.log(path);
})
}).catch((e) => {
console.log(`jszip failed on buffer: ${e}`);
})
}).catch((reason) => {
console.log(`axios request failed: ${reason}`);
})
该text.zip
文件可以毫无问题地解压缩。但是,当我尝试解压缩该文件夹时,它将失败。错误消息是:
jszip failed on response.data: Error: Corrupted zip or bug: unexpected signature (\x00\x50\x4B\x07, expected \x50\x4B\x03\x04)
为了进行比较,我对adm-zip做同样的事情。这适用于压缩文件和压缩文件夹。不过,只有为adm-zip提供缓冲区时,它才起作用。这就是为什么我也尝试将缓冲区传递给jszip的原因。
import axios from 'axios';
import * as AdmZip from 'adm-zip';
axios.get(
"http://localhost:5000/folder.zip",
{ responseType: "blob" })
.then((response) => {
let buffer = Buffer.from(response.data, 'binary');
let admzip = new AdmZip(buffer);
let zipEntries = admzip.getEntries();
zipEntries.forEach(element => {
console.log(element.entryName);
})
}).catch((reason) => {
console.log(`axios request failed: ${reason}`);
})
问题似乎与arraybuffer
vs有关blob
。
根据http请求的配置,中的data
字段axios
response
将包含不同的值。
在下面的代码中:
let responseType = 'blob'
axios.get(
"http://localhost:5000/folder.zip",
{ responseType: responseType })
.then((response) => {
console.log(typeof(response.data);
//...
以下对是可能的:
blob
-> string
,adm-zip有效,jszip不起作用arraybuffer
->object
都可以string
,adm-zip有效,jszip无效如果数据具有类型string
,则adm-zip仅在将其手动转换为时才有效Buffer
。
如果结果类型已经是缓冲区,则两者都可以进行任何转换。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句