Rob*_*urt 4 navigation jsf download
我需要找到一种在生成文件下载后执行页面导航的方法.到目前为止,我已经准备好了文件下载和工作:
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();
Run Code Online (Sandbox Code Playgroud)
到目前为止,我尝试从ExternalContext重定向,但我得到一个IllegalStateException.
ec.redirect(url)
Run Code Online (Sandbox Code Playgroud)
我还尝试将所有以前的代码包装在一个字符串方法中,该方法返回最后要导航的页面.那也行不通.
有什么建议?
您不能向1个请求返回2个回复.您只能对1个请求返回1个响应.文件下载计为一个响应,重定向计为另一个响应.
最好的办法是返回一个以某种方式自动发起新请求的响应.然后可以将第二个响应返回到此自动启动的请求.JavaScript在这方面非常有用,例如window.location(在当前窗口中触发新请求),window.open()(在新窗口中触发新请求)和form.submit()(提交POST表单).
最简单的方法是重定向到目标页面,其中一些JavaScript被有条件地呈现(并立即执行),这反过来通过例如window.location或者触发文件下载form.submit().window.open()如果下载本身已设置为附件,则不合适.请注意,在用户保存文件下载后,此方法不会重定向,这是完全不可能的,因为在保存下载的最后一位时,没有客户端事件可以挂钩.相反,首先执行重定向,然后执行文件下载.
如果您真的很难,那么您可以随时创建一个applet或webstart应用程序,它完全管理下载文件的保存,以便您可以在保存最后一位后轻松执行重定向.然而,这是IMO简单笨拙(甚至可能对用户体验有害;例如我个人讨厌在几个网站上使用这种"下载管理器").
| 归档时间: |
|
| 查看次数: |
4032 次 |
| 最近记录: |