我正在使用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
。
答案 0 :(得分:5)
事实证明,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
回调是成功还是失败,并且同时检查readyState
和status
可以判断它是否成功。
还有其他一些方法可以让它发挥作用,但我认为这是最好的。更多细节在这里:
答案 1 :(得分:2)
我遇到了同样的问题。这是因为您设置了数据类型'json'。 只要把它拿出来或说明白就可以了。 您的服务器或uploadhandler不会返回json答案。