iframe transport не передает никаких данных

Я использую jQuery-File-Upload с jQuery-Iframe-Transport, чтобы попытаться получить поддержку более старых версий IE.

Я установил forceIframeTransport возможность true так что он ведет себя более или менее одинаково во всех браузерах, но я, похоже, не получаю никаких данных обратно на стороне сервера, независимо от браузера, когда он использует транспорт iframe.

Я выплюнул заголовки запроса на стороне сервера и вернулся:

array(
    Host => "*******"
    Connection => "keep-alive"
    Content-Length => "0"
    Accept => "*/*"
    Origin => "**************"
    X-Requested-With => "XMLHttpRequest"
    User-Agent => "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17"
    DNT => "1"
    Referer => "***********"
    Accept-Encoding => "gzip,deflate,sdch"
    Accept-Language => "en-GB,en-US;q=0.8,en;q=0.6"
    Accept-Charset => "ISO-8859-1,utf-8;q=0.7,*;q=0.3"
    Cookie => "*********"
)

[ ***** указана выданная информация; тебе это не нужно;)]

Который выглядит хорошо, но $_REQUEST пуст (т. е. array()), и входной буфер тоже пуст:

$handle = fopen('php://input', 'r');

$file_data = '';

while(($buffer = fgets($handle, 4096)) !== false) {
    $file_data .= $buffer;
}

fclose($handle); // $file_data = '';

Все это работало нормально, когда я не использовал iframe-transport, но мне нужна поддержка IE... есть ли у кого-нибудь опыт передачи файлов с помощью iframe и может быть известно, почему не поступают данные?


Когда я использую https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js и форсирую перенос iframe, он работает в Chrome, но запросы даже не поступают на сервер в IE.

Когда я использую https://github.com/cmlenz/jquery-iframe-transport/blob/master/jquery.iframe-transport.js и принудительно переносим iframe, он ломается в Chrome, но это нормально, потому что Chrome поддерживает правильную передачу файлов XHR, и запросы по крайней мере попадают на сервер в IE, но данные не поступают через.

Я обновил свой скрипт для поддержки любого метода передачи:

if(empty($_FILES)) {
    $handle = fopen('php://input', 'r');

    $file_data = '';

    while(($buffer = fgets($handle, 4096)) !== false) {
        $file_data .= $buffer;
    }

    fclose($handle);
} else {
    $file_data = file_get_contents($_FILES['files']['tmp_name'][0]);
}

Но опять же, я все еще не могу получить какие-либо данные в IE независимо от того, что я делаю.

Когда я говорю "IE", я специально тестирую IE 8 прямо сейчас. Мне нужна поддержка обратно до 7, хотя. Этот парень требует поддержки вплоть до IE 6.

2 ответа

Решение

После многих часов я наконец-то нашел решение проблемы.

Во-первых, вам нужно использовать транспортный плагин, который поставляется в комплекте с jQuery-file-upload, потому что он был создан для него;) Я не совсем уверен, почему у другого шаг вперед, но я вернусь к этому в минута.

В IE я заметил, что где-то в основной библиотеке jquery я получаю ошибку JavaScript "Доступ запрещен". Из того, что я читаю онлайн, обычно это происходит, когда вы пытаетесь отправить URL-адрес в другой домен, чего я не делал, поэтому я отклонил его.

Я сравнивал, что два разных транспортных скрипта делали по-разному, когда я подошел к строке, в которой говорилось form.submit() в одном варианте и form[0].submit() в другом. Поэтому я попытался добавить [0] а затем заметил, что ошибка "доступ запрещен" изменен, чтобы указать на эту строку. Так ясно, что не понравилось, куда я отправлял файлы.

Я дважды проверил form.action и URL все еще выглядел нормально. Через некоторое Google-фу я обнаружил, что вы можете также получить эту ошибку, если событие не происходит из исходного / исходного элемента ввода файла.

Я заменил собственный ввод на причудливый, а затем вызвал "фальшивое" событие "щелчка" на скрытом исходном вводе. Это не понравилось.

Вынул мою фальшивую кнопку загрузки и выкинул родную (<input type="file"/> к вашему сведению), и теперь все работает как чудо во всех браузерах. Ура!

Для чего это стоит...

Я работал с jQuery v1.9.1, синхронно проверяя файлы на вирусы перед их загрузкой на сервер. Если в файле был вирус, мы возвращали HTTP 400 и HTTP 200, если не вирус.

Ответ HTTP 400 вызвал IE8 "Отказано в доступе" результат.

Когда я изменил ответ сервера с 400 на 401, пользовательский интерфейс работал отлично.

Опять "За что это стоит".

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