java - 下载 zip InputStream Struts2 Java

标签 java struts2 zip inputstream

首先,对于英语,抱歉。 我想知道你是否可以帮我解决这个问题。 我正在尝试的是下载我使用 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/

相关文章:

java - 如何从 Java 中的字节数组创建 Zip 文件

java - 如何使用 spring-amqp 关闭与 Rabbit MQ 代理的连接

java - Maven 禁用插件

java - struts2 date无法通过jquery datetimepicker获取时间

javascript - 在输入元素验证时停止表单提交

python - 将内存中的数据写入加密的 ZIP 或 7Z(不使用磁盘临时文件)

java - 检查 Cookie 状态并限制用户不浏览 Web 应用程序 - 如何操作?

java - 为什么我们不能在 Java 中将整个类声明为同步的?

struts2 s :select value ognl expression

mysql - 使用java struts插入由mysql表中的字段创建的