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

我一直在试图提交enctype =“multipart / form-data”的表单。 我有这个设置,因为表单将涉及jpeg / png上传,一旦我已经find了文本input的ajax提交。

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

  2. 表单数据似乎被下面的jquery正确检索,因为alert行显示:productName = Test + Name&productDescription = Test + Description&OtherProductDetails =

  3. 由jQuery成功函数打印到我的HTML返回的数据是一个PHP错误说:未定义的索引:productName

  4. 删除contentType:false修复了这个问题。

当我谷歌jquery / ajax多部分/表单数据提交,顶部点击至less主要包括'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')types:string当发送数据到服务器时,使用这个内容types。

为什么我们需要将它设置为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; }); 

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

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

尝试解决您的问题:

您正在使用jQuery的.serialize()方法,它使用标准的URL编码表示法创build一个文本string。

使用“contentType:false”时,您需要传递未编码的数据。

尝试使用“新的FormData”而不是.serialize():

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

通过使用console.log()来查看你的formData是如何传递到你的php页面的。

  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; }); });