2

큰 파일을 ColdFusion에서 압축 해제하려면 java.util.zip.ZipFile을 사용하고있었습니다. 그러나 이제이 오류가 발생합니다 : "유효하지 않은 CEN 헤더 (잘못된 서명)".ColdFusion을 사용하여 64 비트 zip 파일 압축

이 게시물이 zip 64 비트 형식과 관련되어 있으며이를 처리하기 위해 java.util.zip.ZipInputStream을 사용할 수 있음을 알 수있는 게시물을 발견했습니다. 그러나, 나는이 오류를 지나갈 수 없습니다 : "당신은 타입 클래스의 스칼라 변수를 역 참조하려고했습니다. 이 줄에 의해 발생한 것입니다 :

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

어떤 도움을 주시면 감사하겠습니다!

  • java.util.zip.ZipException: invalid CEN header (bad signature)

  • http://www.kodejava.org/examples/334.html

  • http://blogs.adobe.com/cantrell/archives/2004/01/byte_arrays_and_1.html

  • : 여기

    내 코드

    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

배열의 길이를 사용하는 것에 비해처럼 보인다. 당신의 코드에서 buffer.length 대신 2048을 사용 해봤습니까? BufferedOutputStream에 기본 크기가 있으므로 버퍼 크기 인수를 완전히 삭제할 수도 있습니다. 적어도 CF가 FileOutputStream 또는 length 인수에 문제가 있는지 여부를 알려줄 것입니다. – barnyr

+1

저는 이것이 당신이 찾고있는 것이 아니라는 것을 알고 있습니다. 그러나 CF unzipping 파일의 문제에 직면했을 때, 우리는 cfexecute로 7zip의 CLI를 사용하기로 전환했고 절대로 되돌아 가지 않았습니다. 그것이 효과가 있다면 많은 일과 코드를 절약 할 수 있습니다. 귀하의 질문에 대답하기 위해'buffer.length' 대신'ArrayLen (buffer)'을 사용할 수 있습니다. – Busches

답변

2

buffer.length 대신 ArrayLen(Buffer)을 전달하면 오류가 해결됩니다.

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

또한 java.lang.reflect.ArraygetLength(array) 방법을 사용할 수 있지만 다른 인스턴스를 생성하는 것은 과잉 CF가 제대로 처리되지 않을 수 있습니다 특별한 경우가 자바 arrayLen()

+0

+1. 'ArrayLen'은 갈 길입니다. – Leigh