Невозможно извлечь 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
Опция должна работать до тех пор, пока вы не беспокоитесь об использовании памяти.