Получить ответ в ajax загрузке файлов
Подскажите пожалуйста, есть такой код на отправку файлов и получения прогресса загрузки этих файлов с помощью xhr:
$.ajax({
url: "https://google.com/",
dataType: "text",
cache: false,
contentType: false,
processData: false,
data: form_data,
type: "post",
xhr: function(){
var xhr = $.ajaxSettings.xhr();
if (xhr.upload) {
xhr.upload.addEventListener('progress', function(event) {
var percent = 0;
var position = event.loaded || event.position;
var total = event.total;
if (event.lengthComputable) {
percent = Math.ceil(position / total * 100);
}
$("#progress_upload_block div div").css("width", + percent +"%");
/*$(".status").text(percent +"%");*/
}, true);
}
return xhr;
},
success: function (response) {
if (response == "no") {
console.log("error");
}
else {
console.log("ok");
}
},
});
На сервере код, который определяет будет ли производиться загрузка или нет.
Проблема в том что получаю этот ответ в success ajax и перед этим файл отправляется на url.
Могу ли я получить ответ от сервера перед xhr?
Ответы (1 шт):
Ответ сервера не может быть раньше окончания запроса. Потому что сервер в конце проверки файла может обнаружить какую-то ошибку, которую он не знает сначала. То есть он не может сразу выдать "OK".
А если он и без файла что-то определяет, то отправьте сначала без файла, а потом второй запрос с файлом.
Сказать неподконтрольному серверу, чтобы он быстрее выдал ответ и проигнорировал файл или загружал его на фоне, нельзя.
Это можно делать только если у вас есть контроль над сервером (если вы пишете его код). Тогда могут быть какие угодно одновременные запросы/ответы или сначала выдача информации в лёгких запросах/ответах, а потом отправка файла в следующем запросе.
Однако если вам для какого-то действия достаточно того, что сервер в принципе продолжает принимать файл, вы можете внутри слушателя 'progress' уже выполнять какие-то действия, например показать сообщение "файл начал отправляться, значит всё идёт по плану".