如何在Spring MVC中将字节数组转换为ZipOutputStream?

时间:2019-06-19 11:36:11

标签: java spring spring-mvc zipoutputstream zipinputstream

尝试读取作为字节数组存储在数据库中的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 个答案:

答案 0 :(得分:2)

您还必须将zip文件的字节数据(内容)也复制到输出中...

这应该有效(未试用):

org.gradle.internal.io.LinePerThreadBufferingOutputStream

顺便说一句:为什么您不只是简单地转发原始zip字节内容?

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

甚至更好(感谢@M。Deinum的评论)

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