对于这个答案,我将假设“普通”JSP/Servlet/HTML/JS,因为我不使用 Struts。然而,对于高级 Struts(和 jQuery)用户来说,将其移植到 Struts(和 jQuery)应该足够简单。
至此,您可以在下载请求的响应中设置一个 cookie,并让 JavaScript 轮询该 cookie。准备好下载后,cookie 将在 JavaScript 中可用。为确保在同一会话中跨多个浏览器窗口/选项卡工作,最好生成一个唯一的下载令牌并将其作为请求参数传回,以便服务器端可以将其设置为 cookie 值。事后不要忘记使 cookie 过期,以防止 cookie 污染。
基本上(你可以<span>
用<img>
指向一些微调器 gif 来代替):
<input type="button" value="Download" onclick="download()" />
<span id="wait" style="display:none">Please wait while we prepare the download...</span>
使用此 JavaScript(使用 jQuery 时,jquery-cookie 插件可能会有所帮助):
function download() {
var token = new Date().getTime();
var wait = document.getElementById("wait");
wait.style.display = "block";
var pollDownload = setInterval(function() {
if (document.cookie.indexOf("download=" + token) > -1) {
document.cookie = "download=" + token + "; expires=" + new Date(0).toGMTString() + "; path=/";
wait.style.display = "none";
clearInterval(pollDownload);
}
}, 500);
window.location = "download?token=" + token;
}
在 servlet(或 Struts 操作,如果适用)中:
// Prepare download here.
// ...
// Once finished, set cookie and stream download to response.
Cookie cookie = new Cookie("download", request.getParameter("token"));
cookie.setPath("/");
response.addCookie(cookie);
// ...