Резервный вариант для FormData в IE 8/9

FormData не существует в IE 8/9, но мне нужна эта функциональность в эти браузеры. Есть ли для этого хороший запасной вариант?

Я бы попытался отправить данные json, но мне нужно передать файл на сервер. Я добавляю этот файл в formData в современных браузерах и просто отправляю XHR запрос. Поскольку FormData не существует в IE 8/9, это явно не работает.

// I cant seem to get this to work with a file.
$.ajax({
    url: '/genericHandlers/UploadDocsFile.ashx',
    type: "POST",
    data: model.toJSON(),
    contentType: 'application/json'
    }).done(function  (data) { 
       log('stuff happened!');
    });

Может быть, альтернативой является создание поддельного объекта формы в js, а затем добавление к нему данных?


person Mike Fielden    schedule 01.06.2012    source источник
comment
Хотелось бы полифилла для метода window.FormData.   -  person Ash Blue    schedule 31.05.2013
comment
Затем я представляю вам новый полифилл FormData. К сожалению, все еще зависит от создания больших двоичных объектов ... Возможно, вы сможете также используйте это: Blob.js. Чтобы прочитать файл, вам понадобится flash   -  person Endless    schedule 20.10.2016


Ответы (3)


Я знаю только одно возможное решение, но на самом деле это не резерв 1-1 для IE. Нет возможного API связи для отправки файлов, потому что вы не можете связывать поля ввода в старых браузерах, как в современных, использующих FormData. Но вы можете отправить всю форму, используя iframe. В этом случае вы можете использовать плагин jquery.form, который поддерживает XHR DataForm и iframe (данные отправляются с iframe, когда браузер не поддерживает FormData API ).

person Dmitry Polushkin    schedule 05.08.2012

Вы можете отправить файл вручную с помощью XMLHttpRequests, об этом много информации здесь.

Вы можете сначала проверить, может ли браузер использовать объект FormData, с помощью:

if(typeof FormData !== 'undefined')
   ...

В MDN есть эту функцию, которую вы можно изменить для запасного варианта:

var XHR = new XMLHttpRequest();
var urlEncodedData = "";
var urlEncodedDataPairs = [];
var name;

// We turn the data object into an array of URL encoded key value pairs.
for(name in data) {
  urlEncodedDataPairs.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));
}

// We combine the pairs into a single string and replace all encoded spaces to 
// the plus character to match the behaviour of the web browser form submit.
urlEncodedData = urlEncodedDataPairs.join('&').replace(/%20/g, '+');
person 99 Problems - Syntax ain't one    schedule 05.08.2014
comment
@ Карсон Правда? Согласно en.wikipedia.org/wiki/XMLHttpRequest#History_and_support Microsoft добавила объект XMLHttpRequest идентификатор для своих языков сценариев в Internet Explorer 7.0, выпущенном в октябре 2006 года. - person Mihai Caracostea; 14.01.2016
comment
Эта концепция может быть применена к IE 5 и 6 с ActiveXObjects, если вы действительно этого хотите. - person 99 Problems - Syntax ain't one; 21.01.2016

Этот ответ не отвечает строго на вопрос, который вы задали, и по этой причине я понимаю, удалят ли его моды.

Однако ваш вопрос был тесно связан с проблемой, которую я исследовал, а именно: как предлагать загрузку перетаскиванием через FormData () с постепенным ухудшением качества для старых браузеров?

Существует замечательная библиотека под названием dropzone.js, которая предлагает идеальное решение. к моей проблеме. Возможно, самое лучшее то, что библиотека предлагает готовую изящную деградацию для поддержки загрузки файлов в старых браузерах, as подробнее здесь.

Перефразируя источник:

К счастью, если браузер не поддерживается, библиотека dropzone.js показывает настраиваемый резервный класс, который содержит поле ввода и кнопку отправки.

Я надеюсь, что эта информация поможет тем, кто, как и я, ищет простое в реализации и элегантное решение для загрузки файлов.

person Jade Steffen    schedule 04.10.2018