Откат для 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, а затем добавление данных к этому?

Ответ 1

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

Ответ 2

Вы можете отправить файл вручную с помощью 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, '+');