Я использовал java.util.zip.ZipFile
, чтобы распаковать большие файлы с помощью ColdFusion. Однако теперь я получаю эту ошибку: «неверный заголовок CEN (плохая подпись)».Unzip 64-разрядный zip-файл с ColdFusion
Я нашел сообщение, которое показывает, что это связано с zip-64-битным форматом и что я мог бы использовать java.util.zip.ZipInputStream
для его обработки. Однако я не могу пройти эту ошибку: «Вы попытались разыменовать скалярную переменную типа class [B как структуру с членами». что вызвано этой линией:
bos = createObject("java","java.io.BufferedOutputStream").init(fos,buffer.length);
Любая помощь очень ценится!
Вот мой код
fis = createObject("java","java.io.FileInputStream").init(zipFilePath);
bis = createObject("java", "java.io.BufferedInputStream").init(fis);
zis = createObject("java", "java.util.zip.ZipInputStream").init(bis);
cnt=0;
while(1==1){
cnt++;
entry = zis.getNextEntry();
if (isNull(entry))
{
writeOutput("done"&now());
break;
}
nm = entry.getName();
lenPth = len(nm) - len(getFileFromPath(nm));
if (lenPth) {
pth = outputPath & left(nm, lenPth);
} else {
pth = outputPath;
}
if (NOT directoryExists(pth)) {
fil = createObject("java", "java.io.File");
fil.init(pth);
fil.mkdirs();
}
byteClass = createObject("java", "java.lang.Byte").TYPE;
buffer = createObject("java","java.lang.reflect.Array").newInstance(byteClass, 2048);
fos = createObject("java","java.io.FileOutputStream").init(outputPath & nm);
bos = createObject("java","java.io.BufferedOutputStream").init(fos,buffer.length);
while(1==1) {
size = zis.read(buffer, 0, buffer.length);
if(size == -1)
break;
bos.write(buffer, 0, size);
}
bos.flush();
bos.close();
}
zis.close();
fis.close();
источники:
java.util.zip.ZipException: invalid CEN header (bad signature)
http://blogs.adobe.com/cantrell/archives/2004/01/byte_arrays_and_1.html
Массив в Java представляет собой особый случай, который CF не может быть обработка должным образом. Вы пытались использовать 2048 вместо buffer.length в своем коде? Вы также можете полностью отбросить аргумент размера буфера, поскольку BufferedOutputStream имеет размер по умолчанию. Это, по крайней мере, скажет вам, имеет ли CF проблему с аргументом FileOutputStream или length. – barnyr
Я знаю, что это не то, что вы ищете, но в прошлом, когда сталкивались с проблемами с распаковками файлов CF, мы переключились на использование CLI 7zip с cfexecute и никогда не возвращались. Это сэкономит вам много работы и кода, если это сработает для вас. Чтобы ответить на ваш вопрос, вы можете использовать 'ArrayLen (buffer)' вместо 'buffer.length'. – Busches