2

Я использовал 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(); 

источники:

+0

Массив в Java представляет собой особый случай, который CF не может быть обработка должным образом. Вы пытались использовать 2048 вместо buffer.length в своем коде? Вы также можете полностью отбросить аргумент размера буфера, поскольку BufferedOutputStream имеет размер по умолчанию. Это, по крайней мере, скажет вам, имеет ли CF проблему с аргументом FileOutputStream или length. – barnyr

+1

Я знаю, что это не то, что вы ищете, но в прошлом, когда сталкивались с проблемами с распаковками файлов CF, мы переключились на использование CLI 7zip с cfexecute и никогда не возвращались. Это сэкономит вам много работы и кода, если это сработает для вас. Чтобы ответить на ваш вопрос, вы можете использовать 'ArrayLen (buffer)' вместо 'buffer.length'. – Busches

ответ

2

Передача ArrayLen(Buffer) вместо buffer.length будет устранять эту ошибку.

bos = createObject("java","java.io.BufferedOutputStream").init(fos,arrayLen(buffer)); 

Вы также можете использовать getLength(array) метод java.lang.reflect.Array но создает еще один экземпляр, который, кажется, как избыточна по сравнению с использованием длины arrayLen()

+0

+1. «ArrayLen» - это путь. – Leigh