2012-03-06 8 views
0

Вот код, который я использую для создания архива:Ошибка при создании архива в памяти с помощью Java

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ZipOutputStream out = new ZipOutputStream(baos); 
try { 
    for(int i=0; i<docId.length; i++){ 
     BoxDotComDocumentManager docman = new BoxDotComDocumentManager(); 
     Document d = docman.get(docId[i]); 
     ZipEntry entry = new ZipEntry(d.getFileName()); 
     entry.setSize(d.getFileBytes().length); 
     out.putNextEntry(entry); 
     out.write(d.getFileBytes()); 
     resp.setContentType("application/zip"); 
     resp.setHeader("Content-Disposition", "attachment; filename="+ "zipdemo.zip"); 
     out.closeEntry(); 
} 
} catch (Exception e) { 
     System.out.println("E = " + e); 
} 
try { 
     resp.getOutputStream().write(baos.toByteArray()); 
    resp.flushBuffer(); 
} catch (IOException e) { 
    e.printStackTrace(); 
    } 
finally { 
baos.close(); 
out.close(); 
} 

почтовый файл возвращается в браузер, чтобы быть загружены, но когда я пытаюсь загрузите файл, я получаю сообщение об ошибке, что файл не может быть загружен, потому что zip-файл недействителен.

Документ - это объект, который содержит всю информацию о файле, включая фактический файл.

Любые идеи относительно того, что я делаю неправильно? Я пробовал много перестановок, и никто из них, похоже, не работает. Заранее спасибо.

Keith

+0

С одной стороны: когда вы сталкиваетесь с фатальной ошибкой, * не * просто распечатывайте трассировку стека. Отказ выполнить запрос. Кроме того, не ловите голый Exceptino - это почти всегда неправильный подход. О, и почему вы устанавливаете заголовки на каждой итерации цикла? –

+0

Jon - Просто пытаюсь сделать счастливую работу трейла, а затем я обработаю все исключения правильно, то же самое с заголовками; их наличие в цикле или снаружи не изменяет ошибку. Они будут выведены из цикла. –

+1

Но это очень легко для вас * пропустить * исключения. IMO, стоит сначала обработать исключение * сначала *, чтобы вы могли узнать, когда вы действительно переживаете счастливый путь ... –

ответ

2

Попробуйте использовать out.write метод с 3-мя аргументами.

Заменить: out.write(d.getFileBytes());

С: out.write(d.getFileBytes(),0,d.getFileBytes().length);


Примечание: В соответствии с Java док метод записи с одним параметром не читается.

Записывает байты длиной b.length в этот выходной поток.

Метод записи FilterOutputStream вызывает метод записи трех аргументов с аргументами b, 0 и b.length.

Обратите внимание, что этот метод не вызывает метод однофакторного ввода его базового потока с единственным аргументом b.

Внесение изменений в мой собственный код исправил мою проблему.