2011-12-19 1 views
2

Я пытаюсь заархивировать файлы с сервера в папку с помощью ZipOutputStream. После загрузки архива его нельзя открыть после двойного щелчка. Ошибка «Сбой (сжатая) папка недействительна». Но если я открою его из контекстного меню -> 7zip -> open file, он работает нормально. Что может быть причиной проблемы?Недопустимая папка с сжатой (zipped). 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 может открывать широкий диапазон форматов почтовых индексов и относительно толерантен к странностям. Для двойного щелчка Windows требуется относительно конкретный формат и гораздо менее толерантен.

Вам нужно найти zip format, а затем посмотреть на свой файл (и «хорошие») с помощью шестнадцатеричного редактора (например, Hex Editor Neo), чтобы узнать, что может быть неправильным.

(Одна возможность состоит в том, что вы используете алгоритм сжатия неправильно. И есть несколько других вариантов, которые следует учитывать, а также, в частности, является ли или не генерировать Вас «каталог».)

2

Это может быть, что close отсутствует. Возможно, что кодировка пути в zip не может обрабатываться Windows. Возможно, Windows сталкивается с трудностями в структуре каталогов или в том, что имя пути содержит (назад) косую черту. Так что это детективная работа, попытка разных файлов. Если вы немедленно передаете zip в ответ HTTP, то finish должен называться i.o. close.

+0

Может быть, после того, как я разместил исходный код, вы помогли бы мне –

+0

@ Ксения Шапошникова Welcome; Мне любопытно –

+0

fileName в ContentDisposition заголовок должен быть просто «file.zip» без пути. Content-Length не следует указывать, поскольку вы не знаете (сжимается). Вы должны заменить outZip.close на outZip.finish; закрытие сервера JEE. –

Смежные вопросы