Отправка файла с jQuery.ajax дает TypeError

Я пытаюсь отправить файл из формы, используя метод jQuery ajax:

var ofile=document.getElementById('image').files[0];
var formdata = new FormData();
formdata.append("image",ofile);

$.ajax({
    url:'elements/save_elements',
    data:formdata,
    type:'POST'
});

Это приводит к ошибке TypeError: 'append' called on an object that does not implement interface FormData.

Что вызывает эту ошибку? Это происходит не на самом formdata.append, а внутри jQuery.


person user2889070    schedule 01.11.2013    source источник
comment
Какой браузер вы используете?   -  person Chickenrice    schedule 01.11.2013
comment
хорошо, нет проблем, сэр, я получил ответ   -  person user2889070    schedule 01.11.2013


Ответы (3)


У меня была такая же проблема с подобным кодом. Информации об этой ошибке очень мало, поэтому, поскольку ОП не уточнил:

С некоторой отладкой я понял, что ошибка была вызвана вызовом ajax в глубинах jquery, а не фактическим добавлением. Оказывается, я забыл добавить processData: false, contentType: false к запросу ajax; Это устранило проблему.

person Bhau    schedule 16.11.2013
comment
Спасибо. Я читал о processData:false... но не о contentType - person deach; 19.03.2014
comment
Оказывается, если вы ошибетесь в написании processData как proccessData, вы также получите ту же ошибку. Разумный. - person iiminov; 12.12.2014
comment
Я так рад, что это было первое, что появилось, когда я искал в Google сообщение об ошибке. - person w--; 21.12.2014
comment
@w-- Вам повезло! Со мной это было 50+ вещей, которые я прочитал. Потому что я — после 15 лет программирования — не сразу погуглил сообщение об ошибке, а вместо этого погуглил всевозможные плохо сформулированные пожелания… - person maxpower9000; 28.08.2015
comment
Но... мне нужно использовать multipart/form-data в качестве типа содержимого... потому что это то, что ищет мой REST API... может быть, я могу просто... предположить, что входящие запросы имеют тип multipart/form-data? - person CaffeinateOften; 08.09.2016

Он отлично работает, когда вы добавляете следующее к объекту ajax:

contentType: false,
processData: false,

Итак, это должно выглядеть так:

$.ajax({
    url:'elements/save_elements',
    data:formdata,
    type:'POST',
    contentType: false,
    processData: false,
});
person Canaan Etai    schedule 13.09.2016

Добавление этих параметров в ajax решает проблему

$.ajax({
      url: 'upload_ajax.php',
       type: 'POST',
       data: formData,
       contentType: false,
       processData: false,
person Radhika Choudhary    schedule 02.07.2017