Struts中的文件下载启动事件

在我的struts应用程序中,用户可以从服务器下载文件。

我想在按钮单击(启动下载)和文件准备下载之间显示一个微调器。 是否有文件开始下载时触发​​的事件? 我假设它会是某种页面加载事件。

这是我的struts xml的部分:

  application/pdf attachment;filename=${fileName}  /login showError  

单击按钮,我设置window.location = localhost:8080/getFile.action文件下载(n秒后)

在从服务器获取文件的时间内显示微调器的方法是什么?

对于这个答案,我将假设“普通”JSP / Servlet / HTML / JS,因为我不使用Struts。 对于高级Struts(和jQuery)用户来说,它应该足够简单地将它移植到Struts(和jQuery)。

到目前为止,您可以在下载请求的响应上设置cookie,并使用JavaScript来轮询该cookie。 准备好下载后,cookie将以JavaScriptforms提供。 为了确保在同一会话中的各种浏览器窗口/选项卡上工作,最好生成一个唯一的下载令牌并将其作为请求参数传回,以便服务器端可以将其设置为cookie值。 不要忘记随后使cookie过期以防止cookie污染。

基本上(你可以用替换指向一些spinner gif):

   

使用此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); // ... 

如果你有一个中间的html视图,那么你可以添加一些延迟的javascript动作来显示一个微调器,同时在后台调用localhost:8080 / getFile.action。 无论如何,一旦下载完成,我不知道如何隐藏微调器。

您不能仅使用客户端脚本来执行此操作,因为下载完成时没有事件。

使用struts2-jquery并对getFile.action进行Ajax调用,同时你必须使用以下tag-lib来进行Ajax调用:

 <%@ taglib prefix="s" uri="/struts-tags"%> <%@ taglib prefix="sj" uri="/struts-jquery-tags"%> 

在头部标签中添加以下行内容,也包括隐藏的图像标签。

     ..............  ...............  

参考链接。