在我的struts应用程序中,用户可以从服务器下载文件。
我希望在按钮单击(启动下载)和文件准备下载之间显示一个微调器。是否有文件开始下载时触发的事件?我认为这将是某种页面加载事件。
这是我的struts xml中的部分:
<action name="getFile" method="getFile" class="foo.pack.TAction">
<result name="success" type="stream">
<param name="contentType">application/pdf</param>
<param name="contentDisposition">attachment;filename=${fileName}</param>
</result>
<result name="login" type="redirect">/login</result>
<result name="error" type="tiles">showError</result>
</action>
点击按钮,我设置window.location = localhost:8080/getFile.action
接下来(n秒后)下载文件
在从服务器获取文件的时间内显示微调器的方法是什么?
答案 0 :(得分:2)
对于这个答案,我将假设“普通”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 plugin可能会有所帮助):
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);
// ...
答案 1 :(得分:0)
如果你有一个中间的html视图,那么你可以添加一些延迟的javascript动作来显示一个微调器,而在后台调用localhost:8080 / getFile.action。无论如何,一旦下载完成,我不知道如何隐藏微调器。
答案 2 :(得分:0)
您不能仅使用客户端脚本执行此操作,因为下载完成时没有事件。
使用struts2-jquery
并向getFile.action
发出Ajax调用,同时你必须使用以下tag-lib才能进行Ajax调用:
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
将以下内容添加到您的head标记内,还有隐藏的图片标记。
<head>
<sj:head locale="de" jqueryui="true" defaultIndicator="myDefaultIndicator"/>
</head>
<body>
..............
<img id="myDefaultIndicator" src="images/ajax-loader.gif" alt="Loading..." style="display:none"/>
...............
</body>