一尘不染

Struts中的文件下载开始事件

jsp

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

从服务器获取文件期间,如何显示微调框?


阅读 219

收藏
2020-06-08

共1个答案

一尘不染

对于此答案,我将假定“纯” 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);
// ...
2020-06-08