【发布时间】:2013-06-05 01:57:11
【问题描述】:
我需要找到一种在生成文件下载后执行页面导航的方法。到目前为止,我已经准备好文件下载并正常工作:
FileInputStream stream = new FileInputStream(file);
FacesContext fc = FacesContext.getCurrentInstance();
ExternalContext ec = fc.getExternalContext();
ec.responseReset();
ec.setResponseContentType("application/octet-stream");
ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
OutputStream out = ec.getResponseOutputStream();
byte[] outputByte = new byte[4096];
while(stream.read(outputByte, 0, 4096) != -1)
{
out.write(outputByte, 0, 4096);
}
stream.close();
out.flush();
out.close();
fc.responseComplete();
到目前为止,我已经尝试从 ExternalContext 重定向,但我得到了 IllegalStateException。
ec.redirect(url)
我还尝试将所有以前的代码包装在一个字符串方法中,该方法返回最后要导航的页面。那也没用。
有什么建议吗?
【问题讨论】:
-
上次我不得不做类似的事情时,我将文件下载委托给一个普通的旧 servlet,并从 javascript
window.open调用它。也许有更优雅的方式来做到这一点。 -
好吧,我一整天都在努力。我真的不知道有没有。
-
@dustedrob 2 建议:去掉
responseReset()并用responseComplete替换它,然后调用fc.getApplication().getNavigationHandler().handleNavigation(fc,from,destinationPage)或ec.dispatch(url) -
@kolossus OP 在使用要下载的文件完成响应后使用
fc.responseComplete。如果你之前完成了响应,你会得到错误。 -
AFAIK 以干净的方式下载文件后无法重定向。您最好的选择是在执行表单提交后进行重定向。另一种方法是来自@SJuan76 的示例。
标签: jsf navigation download