Получение кода состояния HTTP из загруженного iframe с помощью Javascript

Я использовал плагин jQuery Form для асинхронной отправки формы. Для форм, содержащих файлы, он копирует форму в скрытый iframe, отправляет его и копирует обратно содержимое iframe. Проблема в том, что я не могу понять, как узнать, какой код состояния HTTP был возвращен сервером. Например, если сервер возвращает 404, данные из iframe будут скопированы как обычно и обработаны как обычный ответ.

Я пробовал копаться в объектах iframe в поисках какого-то атрибута status_code, но не смог найти ничего подобного.


Функцию $.ajax() использовать нельзя, поскольку она не поддерживает загрузку файлов. Единственный известный мне способ асинхронной загрузки файлов - это использовать скрытый метод iframe.

почему бы не запустить js на результат iframe? Я имею в виду, что вы можете установить тайм-аут для загрузки страницы (на родительском элементе), а дочерний элемент (iframe) должен установить значение в родительском элементе. если это значение не установлено до истечения времени ожидания, iframe завершился ошибкой.

Rafael Herscovici 24.05.2011 16:25

ajax можно использовать, если вы сначала вставляете прочтите файл в строку, а затем просто отправляете ее как обычный старый POST

Hashbrown 22.06.2018 08:16
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
47
2
43 020
2

Ответы 2

Вы не можете получить заголовки страниц с помощью 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, предотвращая отображение вашего сообщения об ошибке.

KyleWpppd 01.03.2012 01:01

Вы не можете напрямую получить код состояния HTTP из загруженного iframe. Но когда возникает ошибка http, сервер ничего не возвращает в «iframe». Итак, iframe не имеет содержимого. вы можете проверить тело iframe, когда тело iframe пустое, используйте ajax с тем же URL-адресом, чтобы получить ответ от сервера. Затем вы можете получить код состояния http из ответа.

Очень неправильно. Это просто обычный случай, но даже не условность или хорошая практика. HTTP-серверы обычно должны отправлять тело ответа, содержащее сообщение об ошибке.

Lothar 25.03.2015 13:37

В случае использования «iframe» для загрузки файла это отличается от обычного HTTP-запроса. В частности, IE9 заменит тело iframe на страницу локальной ошибки с клиентского компьютера, если статус HTTP не равен 200. Таким образом, при попытке получить тело iframe вы получите междоменную ошибку. @Lothar

choi gray 26.03.2015 11:07

Другие вопросы по теме