Struts 中的文件下载开始事件

Posted

技术标签:

【中文标题】Struts 中的文件下载开始事件【英文标题】:File Download start event in Struts 【发布时间】:2012-06-22 14:57:05 【问题描述】:

在我的 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 秒后)

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

【问题讨论】:

我相信执行和等待拦截器 struts.apache.org/2.3.1/docs/execute-and-wait-interceptor.html 的一些工作会给你想要的结果。我确定你使用的是 Struts2 而不是 struts1? 【参考方案1】:

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

至于这一点,您可以在下载请求的响应中设置一个 cookie,并让 javascript 轮询该 cookie。准备好下载后,cookie 将在 JavaScript 中可用。为确保在同一会话中跨多个浏览器窗口/选项卡工作,最好生成一个唯一的下载令牌并将其作为请求参数传回,以便服务器端可以将其设置为 cookie 值。之后不要忘记让 cookie 过期,以防止 cookie 污染。

基本上(您可以用指向一些微调器 gif 的 &lt;img&gt; 替换 &lt;span&gt;):

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

【讨论】:

【参考方案2】:

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

【讨论】:

您可以为此使用 cookie。 我没有中间 html 视图,因此那里没有 javascript。 @BalusC 你能详细说明一下吗?我可以在当前视图上启动微调器。 cookie 将如何帮助我跟踪下载? 在下载响应中设置 cookie(但是我完全不知道如何为 Struts 执行此操作,因为我从未使用过它,因此我没有发布任何答案)并让 JavaScript 检查每隔一段时间。 cookie 仅在下载响应完成后才可用。 有趣。我有点惊讶,无法思考为什么在逻辑上不可能监听事件或得到通知(不知何故)。【参考方案3】:

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

使用struts2-jquery 并对getFile.action 进行Ajax 调用,同时您必须使用以下标记库才能进行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"  style="display:none"/>
...............
</body>

Reference Link.

【讨论】:

以上是关于Struts 中的文件下载开始事件的主要内容,如果未能解决你的问题,请参考以下文章

struts2的配置方法

struts2中的struts.xml文件如何建立?

2Struts2开始深入

Struts中的文件下载

尝试使用 struts 中的 ajax 更新 jsp 页面上的内容时出现问题(触发 onChange 事件时)

Struts2文件上传