如何为“虚拟文件”列表创建ZIP文件并将其输出到httpservletresponse
问题内容:
我的目标是将多个java.io.File对象放入一个zip文件中,并打印到HttpServletResponse,以供用户下载。
这些文件是由JAXB编组创建的。它是一个java.io.File对象,但实际上不在文件系统上(它仅在内存中),因此无法创建FileInputStream。
我见过的所有资源都使用OutputStream打印zip文件内容。但是,所有这些资源都使用FileInputStream(我不能使用)。
有人知道我该怎么做吗?
问题答案:
原来我是个白痴:)正在“创建”的文件保存到无效路径并吞没了异常,因此我认为它是在“创建”的。但是,当我尝试实例化一个新的FileInputStream时,它抱怨该文件不存在(正确地如此)。我头脑清醒,并假设java.io.File对象实际上在某处包含文件信息。但是正如埃里克森指出的那样,这是错误的。
感谢Ralph提供的代码,在解决了无效的路径问题后才使用它。
我的代码:
ZipOutputStream out = new ZipOutputStream(response.getOutputStream());
byte[] buf = new byte[1024];
File file;
InputStream in;
// Loop through entities
for (TitleProductAccountApproval tpAccountApproval : tpAccountApprovals) {
// Generate the file
file = xmlManager.getXML(
tpAccountApproval.getTitleProduct().getTitleProductId(),
tpAccountApproval.getAccount().getAccountId(),
username);
// Write to zip file
in = new FileInputStream(file);
out.putNextEntry(new ZipEntry(file.getName()));
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.closeEntry();
in.close();
}
out.close();