2

私のstrutsアプリケーションでは、ユーザーはサーバーからファイルをダウンロードできます。

ボタンをクリックして(ダウンロードを開始するため)、ファイルをダウンロードする準備ができるまでの間にスピナーを表示したいと思います。ファイルのダウンロードが開始されたときにトリガーされるイベントはありますか?ある種のページ読み込みイベントになると思います。

これは私のstrutsxmlのセクションです:

<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秒後)

ファイルがサーバーからフェッチされている間にスピナーを表示する方法は何でしょうか?

4

3 に答える 3

2

この回答では、Strutsを使用しないため、「プレーン」なJSP / Servlet / HTML/JSを想定します。ただし、高度なStruts(およびjQuery)ユーザーの場合は、Struts(およびjQuery)に移植するのに十分簡単である必要があります。

つまり、ダウンロード要求の応答にCookieを設定し、JavaScriptでそのCookieをポーリングすることができます。ダウンロードを提供する準備が整うと、CookieはJavaScriptで利用できるようになります。同じセッションでさまざまなブラウザウィンドウ/タブ間で確実に機能するには、一意のダウンロードトークンを生成し、それをリクエストパラメータとして返して、サーバー側がCookie値として設定できるようにするのが最善です。クッキーの汚染を防ぐために、後でクッキーを期限切れにすることを忘れないでください。

<span>基本的に(スピナーgifを<img>指すように置き換えることができます):

<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;
}

そして、サーブレット(または該当する場合は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);
// ...
于 2012-06-20T15:32:18.630 に答える
0

中間のhtmlビューがある場合は、ビューがlocalhost:8080 / getFile.actionをバックグラウンドで呼び出している間に、いくつかの遅延javascriptアクションを追加してスピナーを表示できます。とにかく、ダウンロードが完了したらスピナーを非表示にする方法がわかりません。

于 2012-06-20T13:00:44.600 に答える
0

ダウンロードが完了したときのイベントがないため、クライアントスクリプトだけを使用してこれを行うことはできません。

を使用struts2-jqueryしてAjax呼び出しを行うgetFile.actionと同時に、Ajax呼び出しを行うために次のtag-libを使用する必要があります。

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

次の行をヘッドタグと非表示の画像タグの内側に追加します。

<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>

参照リンク。

于 2012-06-20T13:07:55.187 に答える