Невозможно извлечь zip-файл с помощью кода Java, созданного в коде nodeJs

Я хочу создать zip-файл в nodeJs, а затем извлечь его с помощью Java-кода (уже написанной Java-программы для работы с zip-файлами).

Я могу создать zip-файл в nodeJs, используя jszip но мой код Java не может извлечь этот zip-файл (хотя мой искатель может извлечь его, даже мой код извлечения в nodeJs также работает).

Код nodeJs для создания zip:

this.zip = function (sourceDirectory, zipFile, excludParent) {
        var zip = new JSZip();

        var list = getFiles(sourceDirectory, excludParent);
        for (var i = 0; i < list.length; i++) {
            var obj = list[i];
            if(typeof(obj.source) == "undefined"){
                if (excludParent)
                    zip.folder(obj.target.substring(obj.target.indexOf("/") + 1));
                else
                    zip.folder(obj.target);
            }else {
                if (excludParent)
                    zip.file(obj.target.substring(obj.target.indexOf("/") + 1), fs.readFileSync(obj.target), {base64: true});
                else
                    zip.file(obj.target, fs.readFileSync(obj.target), {base64: true});
            }
        }
        zip.generateNodeStream({type:'nodebuffer', streamFiles:true, compressionOptions:'DEFAULT'})
            .pipe(fs.createWriteStream(zipFile))
            .on('finish', function () {
                console.log(zipFile + " written.");
            })
    };

    var getFiles = function (sourceDirectory, excludeParent) {
        var list = [];
        if (excludeParent) {
            if (fs.lstatSync(sourceDirectory).isDirectory()) {
                var fileList = fs.readdirSync(sourceDirectory);
                for (var i = 0; i < fileList.length; i++) {
                    list = list.concat(getFiles_(sourceDirectory + sep, fileList[i]));
                }
            }
        } else {
            list = getFiles_("", sourceDirectory);
        }
        return list;
    };


    var getFiles_ = function (parentDir, path) {
        var list = [];

        if (path.indexOf(".") == 0) return list;
        if (fs.lstatSync(parentDir + path).isDirectory()) {
            list.push({target: parentDir + path});

            var fileList = fs.readdirSync(parentDir + path);
            for (var i = 0; i < fileList.length; i++) {
                list = list.concat(getFiles_(parentDir + path + sep, fileList[i]));
            }
        } else {
            list.push({source: parentDir + path, target: parentDir + path});
        }
        return list;
    };

Java-код для извлечения файла:

public void unzip(String zipFilePath, String destDirectory) throws IOException {
        File destDir = new File(destDirectory);
        if (!destDir.exists()) {
            destDir.mkdir();
        }
        ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));
        ZipEntry entry = zipIn.getNextEntry();
        // iterates over entries in the zip file
        while (entry != null) {
            String filePath = destDirectory + File.separator + entry.getName();
            if (!entry.isDirectory()) {
                // if the entry is a file, extracts it
                extractFile(zipIn, filePath);
            } else {
                // if the entry is a directory, make the directory
                File dir = new File(filePath);
                dir.mkdirs();
            }
            zipIn.closeEntry();
            entry = zipIn.getNextEntry();
        }
        zipIn.close();
    }

Этот код генерирует следующую трассировку стека:

java.util.zip.ZipException: only DEFLATED entries can have EXT descriptor
    at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:310)
    at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:122)
    at module.builder.ZipUtility.unzip(ZipUtility.java:57)
    at module.builder.DataPatcher.unZipAndroidImageFiles(DataPatcher.java:624)
    at module.builder.DataPatcher.patchAndroid(DataPatcher.java:145)
    at module.builder.FXMLDocumentController$5.call(FXMLDocumentController.java:324)
    at module.builder.FXMLDocumentController$5.call(FXMLDocumentController.java:312)
    at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.lang.Thread.run(Thread.java:745)

Этот код Java работает нормально, если я создаю ZIP-файл через приложение (т.е. winzip, winrar, почтовый индекс, сделанный искателем и т.д.), но это бросает ava.util.zip.ZipException: only DEFLATED entries can have EXT descriptor при извлечении почтового индекса, сделанного через вышеупомянутое nodeJs метод.

1 ответ

Я столкнулся с той же проблемой сегодня.

Проблема с streamFiles:true передается как опция zip.generateNodeStream(), Из документов:

Когда этот параметр имеет значение true, мы транслируем файл и используем дескрипторы данных в> конце записи. Эта опция использует меньше памяти, но некоторые программы могут> не поддерживать дескрипторы данных (и не будут принимать сгенерированный zip-файл).

Удаление streamFiles:true Опция должна работать до тех пор, пока вы не беспокоитесь об использовании памяти.

Другие вопросы по тегам