Представление JQuery / Ajax (enctype = "multipart / form-data"). Почему «contentType: False» вызывает неопределенный индекс в PHP?

Я пытаюсь отправить форму с enctype = "multipart / form-data". У меня есть этот параметр, потому что форма будет включать jpeg / png uploads, как только я выясню представление ajax для ввода текста.

  1. php отлично работает при ссылке на скрипт, используя действие в форме html.

  2. данные формы, по-видимому, правильно извлекаются с помощью приведенного ниже jquery, поскольку строка предупреждения показывает: productName = Test + Name & productDescription = Test + Описание & OtherProductDetails =

  3. возвращенные данные, напечатанные в моем HTML функцией jquery success, являются ошибкой php: Undefined index: productName

  4. удаление contentType: false исправляет проблему.

Когда я получаю jQuery / ajax multipart / form-data, верхние хиты, по крайней мере, в основном включают «contentType: false». Пожалуйста, может кто-нибудь объяснить мне причину?

http://digipiph.com/blog/submitting-multipartform-data-using-jquery-and-ajax http://hayageek.com/jquery-ajax-form-submit/ Отправка multipart / formdata с помощью jQuery.ajax

В документации API jquery говорится: contentType (по умолчанию: «application / x-www-form-urlencoded; charset = UTF-8») Тип: String При отправке данных на сервер используйте этот тип контента.

Зачем нам нужно установить для него значение false для представления данных multipart / form? Когда вообще будет нужна ложная настройка?

Jquery:

$("#addProductForm").submit(function (event) { event.preventDefault(); //grab all form data var formData = $(this).serialize(); $.ajax({ url: 'addProduct.php', type: 'POST', data: formData, async: false, cache: false, contentType: false, processData: false, success: function (returndata) { $("#productFormOutput").html(returndata); alert(formData); }, error: function () { alert("error in ajax form submission"); } }); return false; }); 

параметр contentType для false используется для форм multipart / form-data, которые передают файлы.

Если для параметра contentType задано значение false, это вынуждает jQuery не добавлять заголовок Content-Type, в противном случае граница границы будет отсутствовать. Кроме того, при отправке файлов через multi-part / form необходимо оставить флаг processData установленным в false, иначе jQuery попытается преобразовать вашу FormData в строку, которая не удастся.

Чтобы устранить проблему, выполните следующие действия:

Вы используете метод .serialize () jQuery, который создает текстовую строку в стандартной кодировке с кодировкой URL.

Вы должны передавать некодированные данные при использовании «contentType: false».

Попробуйте использовать «new FormData» вместо .serialize ():

  var formData = new FormData($(this)[0]); 

Соблюдайте разницу в том, как ваша форма данных передается на вашу php-страницу с помощью console.log ().

  var formData = new FormData($(this)[0]); console.log(formData); var formDataSerialized = $(this).serialize(); console.log(formDataSerialized); 

Укажите атрибут действия формы, как показано ниже, он решит вашу проблему.

 <form name="addProductForm" id="addProductForm" action="javascript:;" enctype="multipart/form-data" method="post" accept-charset="utf-8"> 

Код jQuery:

 $(document).ready(function () { $("#addProductForm").submit(function (event) { //disable the default form submission event.preventDefault(); //grab all form data var formData = $(this).serialize(); $.ajax({ url: 'addProduct.php', type: 'POST', data: formData, async: false, cache: false, contentType: false, processData: false, success: function () { alert('Form Submitted!'); }, error: function(){ alert("error in ajax form submission"); } }); return false; }); });