使用Ajax将FormData对象发送到服务器(包含文件)
我有一个包含文本和文件字段的表单。 我试图将整个事情提交给托管在服务器上的php脚本,并返回validation消息。 我的表单看起来像这样:
我的jQuery看起来像:
jQuery("#ambassador").submit(function(event) { event.preventDefault var server = "http://getdripped.com/dev/ambassador.php"; var form = document.getElementById('#ambassador'); var formData = new FormData(form); alert(formData); jQuery.ajax({ url: server, type: 'POST', data: formData, async: false, success: function (data) { alert(data) }, cache: false, contentType: false, processData: false }); return false; });
php只包含$_FILES
数组的print_r
语句和$_POST
数组的另一个语句。 但是两个返回的数组都是空的。
你有两个问题。
未能将表单传递给FormData对象
document.getElementById('#ambassador');
getElementById
方法接受一个id,但是你传递了一个选择器 。 你需要删除#
。 目前,您将null
传递给new FormData
(因为没有匹配的元素,因此gEBId返回null
)。
表格中没有成功的数据
表单控件只有在具有name
属性且没有name
属性的情况下才能成功。
一旦更正了ID,就可以使用表单中的所有成功控件填充表单数据对象:但是没有。
您需要为每个输入添加名称属性。
我会使用iframe作为表单的目标。
另请参阅如何使用iframe进行异步(AJAX)文件上载?
忽略downvote,和
将async设置为true!
您将async设置为false。 这意味着您的成功回调将不会等待回复并在PHP回答之前很久就完成。
如果您遇到更多麻烦,请查看此SO问题,因为已经有答案。
来自jQuery文档 :
请注意,同步请求可能会暂时锁定浏览器,在请求处于活动状态时禁用任何操作。
Quentin对序列化是正确的,我在进一步阅读后删除了序列化选项。