2011-12-19 3 views
2

ZipOutputStream을 사용하여 서버의 파일을 폴더로 압축하려고합니다. 아카이브 다운로드 후 두 번 클릭하여 열 수 없습니다. 오류 "압축 된 (압축 된) 폴더가 잘못되었습니다."라는 오류가 발생합니다. 하지만 컨텍스트 메뉴에서 열면 -> 7zip -> 파일 열기가 정상적으로 작동합니다. 문제의 원인은 무엇일까요?압축 된 (압축 된) 폴더가 유효하지 않습니다. Java

sourceFileName="./file.txt"' 
        sourceFile = new File(sourceFileName); 

        try { 
         // set the content type and the filename 
         responce.setContentType("application/zip"); 
         response.addHeader("Content-Disposition", "attachment; filename=" + sourceFileName + ".zip"); 
         responce.setContentLength((int) sourceFile.length()); 


         // get a ZipOutputStream, so we can zip our files together 
         ZipOutputStream outZip = new ZipOutputStream((responce.getOutputStream()); 

         // Add ZIP entry to output stream. 
         outZip.putNextEntry(new ZipEntry(sourceFile.getName())); 

         int length = 0; 
         byte[] bbuf = new byte[(int) sourceFile.length()]; 

         DataInputStream in = new DataInputStream(new FileInputStream(sourceFile)); 
         while ((in != null) && ((length = in.read(bbuf)) != -1)) { 
          outZip.write(bbuf, 0, length); 
         } 

         outZip.closeEntry(); 
         in.close(); 
         outZip.flush(); 
         outZip.close(); 

답변

3

7zip은 다양한 종류의 zip 형식을 열 수 있으며 비교적 기묘합니다. Windows 더블 클릭은 상대적으로 특정한 형식을 필요로하며 훨씬 덜 관대합니다.

zip format을 검색 한 다음 16 진수 편집기 (예 : 16 진수 편집기 Neo)로 파일 (및 "양호한"파일)을보고 잘못된 것이 있는지 확인해야합니다.

(하나의 가능성은 잘못된 압축 알고리즘을 사용하고 있습니다. 그리고 당신은 "디렉토리"를 생성 특히 여부뿐만 아니라 고려해야 할 몇 가지 다른 변화가 있다는 것입니다.)

2

그것은 일 수 있었다 close가 없습니다. zip의 경로 인코딩이 Windows에서 처리되지 않을 수 있습니다. Windows에서 디렉토리 구조에 문제가 있거나 경로 이름에 슬래시가 들어있을 수 있습니다. 그래서 다른 파일을 시도하는 것은 형사 작업입니다. zip을 HTTP 응답으로 즉시 스트리밍하면 finish을 i.o라고 부릅니다. close.

+0

소스 코드를 게시하면 도움이됩니다. –

+0

@ Ксения Шапошникова 환영합니다. 궁금한데 –

+0

ContentDisposition 헤더의 fileName은 경로없이 "file.zip"이어야합니다. 당신이 알지 못하는 (압축되어있다) Content-Length는 주어져서는 안된다. outZip.finose를 outZip.finish로 바꿔야합니다. closing은 JEE 서버를 수행합니다. –

관련 문제