jQuery上传文件不能与ajax一起使用

时间:2016-01-06 07:59:42

标签: javascript jquery ajax

我尝试使用以下简单代码上传文件,但是我收到错误:

$("#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>

2 个答案:

答案 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) {

        }
    });
});