Jquery/Ajax表单提交(enctype ="multipart/form-data").为什么'contentType:False'导致PHP中未定义的索引?

DVC*_*TIS 30 php forms ajax jquery

我一直在尝试使用enctype ="multipart/form-data"提交表单.我有这个设置,因为一旦我找到了文本输入的ajax提交,表单将涉及jpeg/png上传.

  1. 使用表单html中的操作引用脚本时,php工作正常.

  2. 表单数据似乎由以下jquery正确检索,因为警报行显示:productName = Test + Name&productDescription = Test + Description&OtherProductDetails =

  3. 由jquery成功函数打印到我的HTML的返回数据是一个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/ 使用jQuery.ajax发送multipart/formdata

jquery API文档说:contentType(默认值:'application/x-www-form-urlencoded; charset = UTF-8')类型:字符串将数据发送到服务器时,请使用此内容类型.

为什么我们需要为multipart/form-data提交将其设置为false?什么时候需要虚假设置?

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;
  });
Run Code Online (Sandbox Code Playgroud)

小智 67

contentType选项为false用于传递文件的multipart/form-data表单.

当将contentType选项设置为false时,它会强制jQuery不添加Content-Type标头,否则将丢失边界字符串.此外,当通过多部分/表单提交文件时,必须将processData标志设置为false,否则,jQuery将尝试将FormData转换为字符串,这将失败.

要尝试解决您的问题:

您正在使用jQuery的.serialize()方法,该方法使用标准URL编码表示法创建文本字符串.

使用"contentType:false"时,需要传递未编码的数据.

尝试使用"new FormData"而不是.serialize():

  var formData = new FormData($(this)[0]);
Run Code Online (Sandbox Code Playgroud)

通过使用console.log(),自己查看formData如何传递到php页面的区别.

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

  var formDataSerialized = $(this).serialize();
  console.log(formDataSerialized);
Run Code Online (Sandbox Code Playgroud)

  • `formData`不适用于IE9 (6认同)
  • @ChaitanyaGadkari的解决方法是下载更新的浏览器. (6认同)
  • @George:那么解决方法是什么? (2认同)

Dha*_*dva 7

请将表单操作属性设置如下,它将解决您的问题.

<form name="addProductForm" id="addProductForm" action="javascript:;" enctype="multipart/form-data" method="post" accept-charset="utf-8">
Run Code Online (Sandbox Code Playgroud)

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;
    });
});
Run Code Online (Sandbox Code Playgroud)