Поэтому я использую обычный javascript (без jquery), чтобы отправить файл на сервер. Серверный скрипт PHP возвращает код состояния 200 в конце, но вместо этого javascript получает readyState == 2.
Код PHP отправляет обратно код состояния 200:
header('X-PHP-Response-Code: 200', true, 200);
exit;
Javascript делает:
request.onreadystatechange = function() {
if (request.readyState == 4) {
var message;
switch(request.status) {
case '200':
message = "Data uploaded successfully.";
break;
case '406':
message = "Incorrect file format. Please try again.";
break;
case '410':
message = "Unexpected error. Please contact support.";
break;
default:
break;
}
status_message_container.innerHTML = message;
submit_button.disabled = false;
}
else {
alert( "Unexpected error: " + this.statusText + ".\nPlease try again");
}
};
request.send(formData);
Даже знаю, что код состояния HTTP 200 возвращается правильно (я получаю «ОК») на веб-интерфейсе. Сценарий JS видит readyState==2
(т. е. еще блок всегда срабатывает)
Насколько я понимаю, код состояния сервера 200 должен дать readyState == 4
??
Во-первых, onreadystate
не только уволен один раз. Он запускается несколько раз, вы должны быть в состоянии справиться с этим. Вот коды, которые вы должны обработать:
0 UNSENT — open () еще не был вызван
1 ОТКРЫТО — send () еще не был вызван
2 HEADERS_RECEIVED — send () был вызван, а заголовки и статус доступны
3 ЗАГРУЗКА Загрузка; — responseText содержит частичные данные
4 — Операция завершена
Ваш код находится в блоке else на readyState == 2
(полученные заголовки) и при условии, что это состояние ошибки, когда это не так.
Ваша проверка ошибок должна быть внутри request.readyState == 4
проверять. Таким образом, запрос выполнен, но могла также быть ошибка:
if (request.readyState == 4) {
switch(request.status) {
case '200':
message = "Data uploaded successfully.";
break;
// Error handling here
default: alert( "Unexpected error: " + this.statusText + ".\nPlease try again"); break;
}
}
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
Других решений пока нет …