在这种情况下,我创建了一个包含搜索结果文件的zip文件,并尝试将其发送给用户。这是我目前正在尝试使用的一大块代码。
File[] zippable = new File[files.size()];
File resultFile = ZipCreator.zip(files.toArray(zippable), results);
InputStream result = new FileInputStream(resultFile);
IOUtils.copy(result, response.getOutputStream());
然而,目前这种方法并不正常。它不返回我创建的zip文件,而是返回一个html文件。如果我之后手动更改文件扩展名,我可以看到该文件的内容仍然是我需要的搜索结果。所以问题就在于返回响应的正确扩展。
有没有人对这种情况有任何建议?
答案 0 :(得分:7)
您需要将Content-Type
响应标头设置为值application/zip
(或application/octet-stream
,具体取决于目标浏览器)。此外,您可能希望发送指示附件状态和文件名的其他响应标头。
答案 1 :(得分:1)
在流式传输结果之前,您需要将内容类型标头设置为application/octet-stream
。取决于您实际使用response
的实施方式。
答案 2 :(得分:0)
以下是一些工作代码,以防万一需要它:
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// The zip file you want to download
File zipFile = new File(zipsResourcesPath + zipFileName);
response.setContentType("application/zip");
response.addHeader("Content-Disposition", "attachment; filename=" + zipFileName);
response.setContentLength((int) zipFile.length());
try {
FileInputStream fileInputStream = new FileInputStream(zipFile);
OutputStream responseOutputStream = response.getOutputStream();
int bytes;
while ((bytes = fileInputStream.read()) != -1) {
responseOutputStream.write(bytes);
}
} catch (IOException e) {
logger.error("Exception: " + e);
}
}
HTML:
<a class="btn" href="/path_to_servlet" target="_blank">Download zip</a>
希望这有帮助!
答案 3 :(得分:0)
所以我为此找到了一个 hack :) 只需在您的文件名中添加“.zip”并将您的内容类型设置为 application/zip。很有魅力。
response.setContentType("application/zip");
String licenseFileName = eId;
response.setHeader("Content-disposition", "attachment; filename=\"" + licenseFileName +".zip");