首先,对于英语,抱歉。 我想知道你是否可以帮我解决这个问题。 我正在尝试的是下载我使用 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){...}
}
我的 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){...}
}
感谢您的帮助。
最佳答案
参数<param name="inputName">inputStream</param>
告诉 Struts2 从哪里获取将发送给客户端的原始字节。在您的情况下,您想要发送压缩字节。相反,您正在设置 inputStream=ZipInputStream
,这是一个采用压缩源的流 - 解压坐下。你不想这样,你想发送原始压缩字节。
然后替换
inputStream = new ZipInputStream(new ByteArrayInputStream(baos.toByteArray()))
由
inputStream = new ByteArrayInputStream(baos.toByteArray())
它应该可以工作
关于java - 下载 zip InputStream Struts2 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20195079/