【发布时间】:2013-12-10 07:08:31
【问题描述】:
首先,对不起英语。 我想知道你能不能帮我解决这个问题。 我正在尝试下载我使用 Struts2 从多个字节 [] 创建的 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){...}
}
我的动作 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){...}
}
感谢您的帮助。
【问题讨论】:
标签: java struts2 zip inputstream