我尝试使用以下简单代码上传文件,但是我收到错误:
$("#register_to_buy_card").submit(function (event) {
event.preventDefault();
var $this = $(this);
var url = $this.attr('action');
var form = document.forms.namedItem($this);
var formdata = new FormData(form);
$.ajax({
url: url,
type: "POST",
dataType: "json",
data: formData,
success: function (data) {
},
error: function (data) {
}
});
});
我收到此错误:
TypeError: Argument 1 of FormData.constructor is not an object.
var formdata = new FormData(form);
HTML:
<form id="register_to_buy_card" enctype="multipart/form-data" accept-charset="UTF-8" action="http://localhost/sample/registerToBuyCard" method="POST">
<label for="passport">Passport Image</label>
<input type="file" name="passport">
<div class="checkbox">
<button class="btn btn-default" type="submit">Submit</button>
</form>
答案 0 :(得分:2)
您得到的错误是因为:
var form = document.forms.namedItem($this);
namedItem
需要一个字符串。您正在传递它var $this = $(this);
,这是一个jQuery对象。
this
已经是表单对象。所以改变:
var $this = $(this); var url = $this.attr('action'); var form = document.forms.namedItem($this); var formdata = new FormData(form);
到
var formdata = new FormData(this);
(是的,这四行应该用一行代替)。
然后查看this other question,其中包含与您的错误消息无直接关系的问题。
答案 1 :(得分:0)
问题是FormData
中传递的元素不是表单而是jQuery对象。您需要将this
的表单放在上下文中。
您需要更新此内容:
var formdata = new FormData(this);
并使用:
contentType:false,
processData:false,
在ajax选项中。
更新的代码应为:
$("#register_to_buy_card").submit(function (event) {
event.preventDefault();
var url = $(this).attr('action');
var formdata = new FormData(this); // <--------update with 'this'
$.ajax({
url: url,
type: "POST",
dataType: "json",
data: formData,
contentType:false, //<-----------required
processData:false, //<-----------required
success: function (data) {
},
error: function (data) {
}
});
});