1

我想用JSZip下载并解压缩一个文件夹,我用这个npm 包安装了它。JSZip 无法这样做,抱怨损坏的 zip 或意外的签名。

有很多关于jszip的问题。他们都没有回答我的具体问题,但为了完整起见,我在这里列出了一些参考资料:

作为测试场景,我创建了两个 zip 文件,名为folder.ziptext.zip. text.zip是一个压缩的txt文件,folder.zip是一个压缩文件夹,包含一个txt文件。两者都已在 Ubuntu 中通过命令行进行压缩。

我用npm 包 serve来托管它们。它们可以在 localhost 上访问:http://localhost:5000/test.zip

这是我的代码,它是打字稿,编译后的 Javascript 使用节点执行:

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}`);
    })
4

2 回答 2

1

根据 bugtracker 的说法,似乎 JSZip 有点不完整(目前还存在很多和一般错误)。关于您的错误,还有另一个非常相似的:https ://github.com/Stuk/jszip/issues/489 ,但我确定还有其他错误。

所以答案似乎是:JSZip 至少对于一般情况来说还不是生产就绪库,并且还不支持它。

于 2020-02-28T10:50:05.187 回答
0

这个问题似乎与arraybuffervs相关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.

如果结果类型已经是缓冲区,则两者都无需任何转换即可工作。

于 2020-02-28T13:02:46.353 回答