jquery ajax скачивание файла

204
29 сентября 2018, 05:20

Есть метод

downloadDocument: function(event) {
    var documentId = event.currentTarget.attributes.getNamedItem('documentId').value;
    var host = window.location.protocol + '//' + window.location.host;
    var url = host.concat('/api/download/' + documentId);
    $.ajax({
        type: "GET",
        url: url,
        data: {},
        success: function (data) {
            window.location.assign(url);
        },
        error: function(msg) {
            // действия при ошибке;
        }
    });
}

Код не мой, проблема возникла при больших размерах файла (страница просто вылетает с ошибкой Оппаньки :) ). При исследовании я заметил, что файл скачивается 2 раза. 1 раз при запросе ajax, а второй раз после window.location.assign(url);.

Я в JS не силен, поэтому не знаю, как исправить поведение под требования. А требования такие:

При отсутствии файла или других ошибках, сервер возвращает что-то вразумительное, для этого и был создан ajax запрос, чтобы это обработать и вывести сообщение. Но при запросе ajax файл скачиваться не должен. обработчик success для этого не подходит, так как он срабатывает когда ответ полностью получен. Ну и, естественно, файл должен скачиваться 1 раз.

UPD:

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

Answer 1
$.ajax({
    type: "GET",
    url: url + "?check=true",
    data: {},
    dataType: "text";
    success: function (data) {
        if (data == "success")
            window.location.assign(url);
    },
    error: function(msg) {
        // действия при ошибке;
    }
});

А на сервере проверяйте наличие в запросе "check=true", и если оно там есть и с файлом все в порядке, возвращайте слово "success".

Answer 2

Оказалось, что $.ajax мне просто не подходит. В описании работы с ним сказано, что onreadystatechange не реализован, так как другие свойства и обработчики покрывают все мыслимые требования. Оказалось, что не все.

Дело в том, что при возврате сервером ошибки, я могу ее отловить уже на стадии 2 (когда получены заголовки ответа). Если результат 200, я просто прерываю ajax запрос и меняю адрес окна (window.location) на адрес скачивания файла (тот же url что был использован и для ajax запроса). Если вернулся другой код, то запрос выполняется до конца и в самом конце я получаю сообщение об ошибке, которую вывожу пользователю.

В общем запрос я отправляю через нативный XMLHttpRequest.

READ ALSO
Сокращение объема кода по работе с табами (скрытие/отображение)

Сокращение объема кода по работе с табами (скрытие/отображение)

Есть табы, которые скрыты, при клике по элементу с нужным атрибутом, таб появляетсяКак такой код, можно сократить? Причём, чем короче получится,...

188
Webasyst: ошибка в шаблоне

Webasyst: ошибка в шаблоне

Syntax Error in template "/public_html/wa-apps/shop/plugins/filters/templates/frontendHeadhtml" on line 2 "<script>loadEvents

182
Chrome 67 Date определяет неверный часовой пояс

Chrome 67 Date определяет неверный часовой пояс

Стал замечать, что Chrome после обновления стал определять московский часовой пояс как-то странно:

208
Работа с формами. JS

Работа с формами. JS

Нигде не могу найти ответаДопустим у меня есть данная форма:

173