jszip可以解压缩文件,但不能解压缩文件夹

时间:2020-02-28 10:24:35

标签: javascript zip jszip adm-zip nodejs-jszip

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

与jszip相关的问题很多。他们中没有一个回答我的特定问题,但是为了完整起见,我在这里列出了一些参考文献:

作为测试方案,我创建了两个压缩文件,分别为folder.ziptext.ziptext.zip是压缩的txt文件,folder.zip是压缩的文件夹,其中包含txt文件。两者都已在Ubuntu中通过命令行压缩。

我要用npm package 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}`);
    })

2 个答案:

答案 0 :(得分:1)

似乎它的JSZip有点不完整,据bugtracker称(还存在很多错误和一般性错误)。关于您的错误,还有另一个非常相似的地方:https://github.com/Stuk/jszip/issues/489,但我敢肯定还有另一个错误。

所以答案似乎是:JSZip至少在一般情况下还不是可用于生产的库,并且还不支持它。

答案 1 :(得分:0)

问题似乎与arraybufferblob有关。

根据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时有效。

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

相关问题