首先,抱歉使用英语。 我想知道你是否能帮我解决这个问题。 我正在尝试使用Struts2和流结果从多个byte[]创建一个zip并下载它。
我使用ZipOutputStream,并成功创建了一个文件。使用FileInputStream读取和下载它,但我的问题是我不想创建一个文件。我只想将ZipOutputStream转换为InputStream(例如ZipIntputStream),并下载该ZipInputStream。 为此,我使用以下代码:
public void downloadZip() {
contentType = "application/octet-stream";
filename="myZip.zip";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytes;
try {
ZipOutputStream zos = new ZipOutputStream(baos);
ZipEntry ze;
bytes = otherClass.getBytes("File1");
ze = new ZipEntry("File1.pdf");
zos.putNextEntry(ze);
zos.write(bytes);
zos.closeEntry();
bytes = otherClass.getBytes("File2");
ze = new ZipEntry("File2.pdf");
zos.putNextEntry(ze);
zos.write(bytes);
zos.closeEntry();
zos.flush();
inputStream = new ZipInputStream(new ByteArrayInputStream(baos.toByteArray()));
zos.close();
}
catch(Exception e){...}
}
我的 action struts.xml
<action...>
<result name="success" type="stream">
<param name="contentType">${contentType}</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${filename}"</param>
<param name="bufferSize">1024</param>
</result>
</action>
问题在于浏览器显示了一条消息,告诉我文件不是有效的zip文件,并且文件大小为0字节。
希望我已经清楚地解释了,非常感谢您的帮助。
编辑:正如我所评论的,最终我找到了解决方案,它与leonbloy的回复非常相似。除了返回ByteArrayInputStream之外,我应该在创建ByteArrayInputStream之前关闭ZipOutputStream。下面是结果代码,也许对其他人有用:
...
zos.closeEntry();
zos.close();
inputStream = new ByteArrayInputStream(baos.toByteArray());
}
catch(Exception e){...}
}
感谢您的帮助。