>使用html格式的动作引用脚本时,PHP工作正常。
>表单数据似乎被下面的jquery正确地检索,因为警报行显示:productName = Test Name& productDescription = Test Description& OtherProductDetails =
>由jquery成功函数打印到我的HTML的返回数据是一个PHP错误,说:Undefined index:productName
> remove contentType:false修复问题。
当我google 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/
Sending multipart/formdata with jQuery.ajax
jquery API文档说:
contentType(默认值:’application / x-www-form-urlencoded; charset = UTF-8′)
类型:字符串
将数据发送到服务器时,请使用此内容类型。
为什么我们需要将其设置为虚假的多部分/表单数据提交?
什么时候需要虚假设定?
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时,会强制jQuery不要添加Content-Type头,否则边界字符串将会丢失。另外,当通过多部分/表单提交文件时,必须将processData标志设置为false,否则,jQuery将尝试将FormData转换为字符串,否则将失败。
尝试解决您的问题:
您正在使用jQuery的.serialize()方法,它以标准的URL编码符号创建一个文本字符串。
使用“contentType:false”时,需要传递未编码的数据。
尝试使用“new FormData”而不是.serialize():
var formData = new FormData($(this)[0]);
看看你的formData如何通过使用console.log()传递到PHP页面的区别。
var formData = new FormData($(this)[0]); console.log(formData); var formDataSerialized = $(this).serialize(); console.log(formDataSerialized);