Как преобразовать байтовый массив в ZipOutputStream весной MVC? - PullRequest
0 голосов
/ 19 июня 2019

Попытка прочитать zip-файл, хранящийся в базе данных, как байтовый массив.

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

Я уже получил много ответов, но не уверен, что не так с приведенным ниже кодом.

Пожалуйста, помогите.

@RequestMapping(value = ApplicationConstants.ServiceURLS.TRANSLATIONS + "/{resourceId}/attachments", produces = "application/zip")
    public void attachments(HttpServletResponse response, @PathVariable("resourceId") Long resourceId) throws IOException {

        TtTranslationCollection tr = translationManagementDAO.getTranslationCollection(resourceId);
        byte[] fileData = tr.getFile();

        // setting headers
        response.setStatus(HttpServletResponse.SC_OK);
        response.addHeader("Content-Disposition", "attachment; filename=\"attachements.zip\"");

        ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());

        ZipInputStream zipStream = new ZipInputStream(new ByteArrayInputStream(fileData));
        ZipEntry ent = null;
        while ((ent = zipStream.getNextEntry()) != null) {
            zipOutputStream.putNextEntry(ent);
        }
        zipStream.close();
        zipOutputStream.close();
    }

1 Ответ

2 голосов
/ 19 июня 2019

Вы также должны скопировать байтовые данные (содержимое) zip-файла на выход ...

Это должно работать (не проверено):

while ((ent = zipStream.getNextEntry()) != null) {
    zipOutputStream.putNextEntry(ent);
    // copy byte stream
    org.apache.commons.io.IOUtils.copy(zis.getInputStream(ent), zipOutputStream);
}

Кстати: почему вы не просто пересылаете исходное содержимое в виде zip-байта?

try (InputStream is = new ByteArrayInputStream(fileData));) {
    IOUtils.copy(is, response.getOutputStream());
}

или даже лучше (благодаря комментарию @M. Deinum)

IOUtils.copy(fileData, response.getOutputStream());
...