Есть метод
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
$.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".
Оказалось, что $.ajax мне просто не подходит. В описании работы с ним сказано, что onreadystatechange не реализован, так как другие свойства и обработчики покрывают все мыслимые требования. Оказалось, что не все.
Дело в том, что при возврате сервером ошибки, я могу ее отловить уже на стадии 2 (когда получены заголовки ответа). Если результат 200, я просто прерываю ajax запрос и меняю адрес окна (window.location) на адрес скачивания файла (тот же url что был использован и для ajax запроса). Если вернулся другой код, то запрос выполняется до конца и в самом конце я получаю сообщение об ошибке, которую вывожу пользователю.
В общем запрос я отправляю через нативный XMLHttpRequest.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Есть табы, которые скрыты, при клике по элементу с нужным атрибутом, таб появляетсяКак такой код, можно сократить? Причём, чем короче получится,...
Syntax Error in template "/public_html/wa-apps/shop/plugins/filters/templates/frontendHeadhtml" on line 2 "<script>loadEvents
Стал замечать, что Chrome после обновления стал определять московский часовой пояс как-то странно: