Я использовал плагин jQuery Form для асинхронной отправки формы. Для форм, содержащих файлы, он копирует форму в скрытый iframe, отправляет его и копирует обратно содержимое iframe. Проблема в том, что я не могу понять, как узнать, какой код состояния HTTP был возвращен сервером. Например, если сервер возвращает 404, данные из iframe будут скопированы как обычно и обработаны как обычный ответ.
Я пробовал копаться в объектах iframe в поисках какого-то атрибута status_code, но не смог найти ничего подобного.
Функцию $.ajax() использовать нельзя, поскольку она не поддерживает загрузку файлов. Единственный известный мне способ асинхронной загрузки файлов - это использовать скрытый метод iframe.
ajax можно использовать, если вы сначала вставляете прочтите файл в строку, а затем просто отправляете ее как обычный старый POST

Вы не можете получить заголовки страниц с помощью JS, но вы можете отличить ошибку от успеха: Попробуйте что-то вроде этого:
<script type = "text/javascript">
var uploadStarted = false;
function OnUploadStart(){
uploadStarted = true;
}
function OnUploadComplete(state,message){
if (state == 1)
alert("Success: "+message);
else
if (state == 0 && uploadStarted)
alert("Error:"+( message ? message : "unknow" ));
}
</script>
<iframe id = "uploader" name = "uploader" onload = "OnUploadComplete(0)" style = "width:0px;height:0px;border:none;"></iframe>
<form id = "sender" action = "/upload.php" method = "post" target = "uploader" enctype = "multipart/form-data" onsubmit = "OnUploadStart()">
<input type = "file" name = "files[upload]"/>
<input type = "submit" value = "Upload"/>
</form>
На стороне сервера:
/*
file: upload.php
*/
<?php
// do some stuff with file
print '<script type = "text/javascript">';
if (success)
print 'window.parent.OnUploadComplete(1,"File uploaded!");';
else
print 'window.parent.OnUploadComplete(0, "File too large!");';
print '</script>';
?>
Если файл слишком велик, php будет 500, предотвращая отображение вашего сообщения об ошибке.
Вы не можете напрямую получить код состояния HTTP из загруженного iframe. Но когда возникает ошибка http, сервер ничего не возвращает в «iframe». Итак, iframe не имеет содержимого. вы можете проверить тело iframe, когда тело iframe пустое, используйте ajax с тем же URL-адресом, чтобы получить ответ от сервера. Затем вы можете получить код состояния http из ответа.
Очень неправильно. Это просто обычный случай, но даже не условность или хорошая практика. HTTP-серверы обычно должны отправлять тело ответа, содержащее сообщение об ошибке.
В случае использования «iframe» для загрузки файла это отличается от обычного HTTP-запроса. В частности, IE9 заменит тело iframe на страницу локальной ошибки с клиентского компьютера, если статус HTTP не равен 200. Таким образом, при попытке получить тело iframe вы получите междоменную ошибку. @Lothar
почему бы не запустить js на результат iframe? Я имею в виду, что вы можете установить тайм-аут для загрузки страницы (на родительском элементе), а дочерний элемент (iframe) должен установить значение в родительском элементе. если это значение не установлено до истечения времени ожидания, iframe завершился ошибкой.