我正在使用jQuery通过附加数据进行AJAX上传。我正在跟踪它的Stackoverflow代码How can I upload files asynchronously?,我正在使用的代码如下:
var formData = new FormData($('form')[0]);
$.ajax({
type: "POST",
url: "ajax/register.php",
dataType: "text",
data: {
name: $("#name").val(),
city: $("#city").val(),
image: formData
},
success: function(text) {
if(text == "data ok pic ok") { window.location = "reg3.php"; }
else { errorMessage(text); }
},
cache: false,
contentType: false,
processData: false
});
});
问题在于,如果我删除与文件相关的代码,例如
var formData = new FormData($('form')[0]);
image: formData
cache: false,
contentType: false,
processData: false
然后代码工作,我可以发送其他数据,也像“名称”和“城市”。当我放回与文件相关的代码时,它停止工作,控制台中没有错误,并且服务器上的PHP脚本没有任何操作(就像它没有收到其他相关数据一样)
有什么想法吗?
提前致谢。
答案 0 :(得分:4)
编写表单以发送文件时,指定POST方法和multipart/form-data
编码。 HTML代码中的每个<input>
都将由浏览器在HTTP请求正文中的part
中进行转换,因此您可以同时发送多个文件和字符串。 Here is the documentation for FormData(请参阅页面底部)。基本上你应该使用
var data = new FormData($('form')[0]);
data.append("name", $("#name").val());
data.append("city", $("#city").val());
// ...
$.post({
"ajax/register.php",
data: data,
processData: false, // tell jQuery not to process the data
contentType: false // tell jQuery not to set contentType
});
FormData
对象旨在直接分配给data
密钥。您将附加字段附加到FormData
对象:它不表示二进制内容。相反,它是name-value pair data structure,其中键始终是字符串,而值可以是字符串或二进制对象。
答案 1 :(得分:0)
尝试添加:enctype:'multipart / form-data'
e.g
{
type: "POST",
url: "ajax/register.php",
dataType: "text",
enctype: 'multipart/form-data',
data: {
name: $("#name").val(),
city: $("#city").val(),
image: formData
}
}