gpt4 book ai didi

jsf - 文件下载后执行页面导航

转载 作者:行者123 更新时间:2023-12-04 23:55:34 24 4
gpt4 key购买 nike

我需要找到一种在生成文件下载后执行页面导航的方法。到目前为止,我已经准备好下载文件并开始工作:

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)

我还尝试将所有先前的代码包装在一个字符串方法中,该方法返回最后要导航的页面。那也没有用。

有什么建议吗?

最佳答案

您不能对 1 个请求返回 2 个响应。您只能对 1 个请求返回 1 个响应。文件下载计为一个响应,重定向计为另一个响应。

最好的办法是返回一个响应,该响应以某种方式自动发起新请求。然后可以对这个自动发起的请求返回第二个响应。 JavaScript 在这方面非常有帮助,比如 window.location (在当前窗口触发新请求),window.open() (在新窗口中触发新请求)和 form.submit() (提交 POST 表单)。

最简单的方法是重定向到目标页面,其中一些 JavaScript 被有条件地呈现(并立即执行),从而触发文件下载,例如window.locationform.submit() . window.open()如果下载本身已设置为附件,则不合适。请注意,这种方法不会在用户保存文件下载后重定向,这显然是不可能的,因为在保存下载的最后一点时没有客户端事件可以挂起。相反,首先执行重定向,然后下载文件。

如果您在这方面真的很顽固,那么您总是可以创建一个小程序或 webstart 应用程序来完全管理下载文件的保存,这样您就可以在保存最后一位后轻松执行重定向。但是,这在 IMO 中很笨拙(甚至可能对 UX 不利;例如,我个人讨厌几个网站上的这种“下载管理器”)。

关于jsf - 文件下载后执行页面导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16930352/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com