1

我正在使用 Blueimp fileupload() 将图像文件发布到 django-tastypie API。

只要文件被上传,下面的代码就可以正常工作:

        $("#image").fileupload({
            dataType: 'json',
            start: function() {
                console.log("start fileupload");
            },
            progress: function(e, data) {
                console.log(data.loaded + " " + data.total);
            },
            beforeSend: function(xhr, settings) {
                xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
            },
            done: function(e, data) {
                console.log("done uploading file.");
            }                   
        });

        $("#image").bind('fileuploadfinished', function (e, data) {
            console.log("fileuploadfinished");
        });

但是,done永远不会调用回调。我尝试绑定fileuploadfinished并且也从未调用过。

start并且progress都按预期调用。

beforeSend是无证的,但 django-tastypie 需要SessionAuthentication它 - 删除它不会改变它done并且fileuploadfinished永远不会被调用。

4

2 回答 2

6

事实证明,django-tastypie 正确返回了 201 状态码。但是,fileupload 不会将此状态代码视为成功。

此代码手动处理状态代码:

    $("#image").fileupload({
        dataType: 'json',
        beforeSend: function(xhr, settings) {
            xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
        },
        complete: function(xhr) {
            if (xhr.readyState == 4) {
                if (xhr.status == 201) {
                    console.log("Created");
                }
            } else {
                console.log("NoGood");
            }
        },
    });

这意味着,complete无论成功还是失败都会调用回调,并且将readyStateandstatus一起检查可以判断它是否成功。

还有其他一些方法可以让它工作,但我认为这是最好的。更多细节在这里:

数据插入成功但jquery仍然返回错误

于 2013-09-22T09:09:49.607 回答
2

我遇到了同样的问题。这是因为您将数据类型设置为“json”。 只需将其保留或将其简单化,它就会起作用。您的 server 或 uploadhandler 未返回 json 答案。

于 2013-10-14T09:40:12.587 回答