Начало загрузки файла в 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 секунд)

Каким будет способ показа счетчика в течение времени, в течение которого файл извлекается с сервера?

Ответ 1

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

К моменту, вы можете настроить cookie на ответ запроса на загрузку и запросить JavaScript для опроса для этого файла cookie. После того, как загрузка будет готова для обслуживания, cookie будет доступен в JavaScript. Чтобы обеспечить работу с различными окнами/вкладками браузера в одном сеансе, лучше всего создать уникальный токен загрузки и передать его в качестве параметра запроса, чтобы сторона сервера могла установить его как значение cookie. Не забудьте выпустить cookie впоследствии, чтобы предотвратить загрязнение печенья.

В принципе (вы можете заменить <span> на <img>, указывая на некоторый spinner 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);
// ...

Ответ 2

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

Ответ 3

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

Используйте struts2-jquery и дайте Ajax-вызов getFile.action, в то же время вам нужно будет использовать следующий тег-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>

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