Вопрос по java, jsp, struts, download – Начало загрузки файла в Struts

2

В моем приложении 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? Umesh Awasthi

Ваш Ответ

3   ответа
0

Если у вас есть промежуточное представление html, то вы можете добавить некоторое отложенное действие javascript для отображения счетчика, в то время как представление вызывает localhost: 8080 / getFile.action в фоновом режиме. Во всяком случае, я не знаю, как скрыть счетчик после завершения загрузки.

Error: User Rate Limit Exceeded TJ-
Error: User Rate Limit Exceeded TJ-
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

Вы не можете сделать это, используя только клиентский скрипт, потому что нет события, когда загрузка завершается.

использованиеstruts2-jquery и позвонить в АяксgetFile.actionв то же время вам нужно будет использовать следующий tag-lib для вызова Ajax:

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

Ссылка Ссылка.

2

Для этого ответа я предполагаю «простой». JSP / Servlet / HTML / JS, поскольку я не использую Struts. Для опытных пользователей Struts (и jQuery) это должно быть достаточно тривиально, чтобы перенести его в Struts (и jQuery).

Кстати, вы можете установить cookie-файл в ответ на запрос на загрузку и использовать JavaScript для опроса этого cookie-файла. Как только загрузка будет готова, файл cookie будет доступен в JavaScript. Чтобы обеспечить работу с различными окнами / вкладками браузера в одном сеансе, лучше всего создать уникальный токен загрузки и передать его обратно в качестве параметра запроса, чтобы сторона сервера могла установить его в качестве значения 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;
}

И в сервлете (или, если применимо, действие 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);
// ...

Похожие вопросы