我在JSF2网络应用程序中遇到“下载文件”功能有困难。下载文件有效(即出现保存对话框并在本地保存文件)。但是,之后,我的网络应用程序不再响应(即不响应按钮点击)。我猜,我已“失去”了回应。
据我所知,下面的解决方案是相当标准的,但它对我不起作用。我想避免使用下载servlet,但这是处理动态文件的更好方法,所以就这样吧。
有人有任何想法如何解决吗?
下面是相关的代码片段,我的所有文件都是在托管bean的操作方法中动态创建的。创建的文件主要是office文档和PDF。我在我当地的Win7机器上使用WLS进行测试。
在我的JSF页面上:
<h:commandButton
id="downloadBtn"
immediate="true"
value="Download"
action="#{myBean.downloadFile}"/>
我的bean操作方法(对于Excel文件):
public void downloadFile() {
byte[] bytes = generateDocument();
String fileName = getFilename();
FacesContext faces = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) faces.getExternalContext().getResponse();
response.reset();
response.setContentType(MimeTypeEnum.MIME_TYPE_EXCEL);
response.setContentLength(bytes.length);
response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + "\"");
BufferedOutputStream out = null;
try {
out = new BufferedOutputStream(response.getOutputStream());
out.write(bytes);
out.flush();
}
catch (IOException e) {
throw new TechnicalException("Error writing response", e);
}
finally {
close(out); // Gently close stream.
}
faces.responseComplete();}
}