создание zip-файла в массив байтов

Я пытаюсь прочитать, создать zip-файл из списка путей к файлам. Я хотел иметь zip-файл в виде массива байтов, чтобы я мог вернуть его как объект ResponseEntity обратно на веб-страницу. проблема в том, что когда я пробовал FileOutputStream, он работал. Я попробовал ByteArrayOutputStream, ZIP-файл поврежден. ниже код

//FileOutputStream bos = new FileOutputStream("C:\\files\\zipfile.zip");  
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(bos);
ArrayList<String> filepaths = getAllFiles();
byte[] contents = null;

for(String path : filepaths) {
    File pdf = new File(path);

    FileInputStream fis = new FileInputStream(pdf);

    ZipEntry zipEntry = new ZipEntry(path.substring(path.lastIndexOf(File.separator)+1));
    zos.putNextEntry(zipEntry);

    byte[] buffer = new byte[1024];
    int len;
    while ((len = fis.read(buffer)) > 0) {
        zos.write(buffer,0,len);
    }

    fis.close();
    zos.closeEntry();
    zos.flush();

}
contents = new byte[bos.size()];
contents = bos.toByteArray();

zos.close();
bos.close();

для 1-й строки 2, которую вы видите выше, если я использую ByteArrayOutputStream, zip-файл кажется поврежденным. Но если я использую FileOutputstream, я не могу открыть zip-файл и его содержимое.

вот как я отправляю обратно массив zip-байтов на веб-страницу. Все эти коды происходят внутри метода контроллера Spring.

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/zip"));
headers.setContentDispositionFormData(zipfileNm, zipfileNm);

ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(contents, headers, HttpStatus.OK);
return response;

person vincent    schedule 29.04.2014    source источник


Ответы (1)


Взгляните на библиотеку Google GUAVA. Это позволяет легко копировать Потоки ввода-вывода. Также проверьте Apache Commons Compress с помощью специальная поддержка ZIP.

Однако вы можете сделать свою жизнь намного проще...
HTTPResponse имеет объект OutputStream. Вместо того, чтобы перетасовывать массивы байтов с помощью функций, вы должны получить этот OutputStream и передать его в качестве параметра функции создания ZIP. Таким образом, вы избежите необходимости использования всей памяти для перетасовки байтов и потенциальных проблем, которые она может с этим повлечь.

Надеюсь, это поможет!

person stwissel    schedule 29.04.2014