我正在使用XMLHttpRequest
将文件从javascript
代码发送到django view
。我需要检测文件是否已发送或是否发生了某些错误。我使用了jquery写下面的javascript。
理想情况下,我想向用户显示该文件未上传的错误消息。是否有某种方法可以在javascript
中执行此操作?
我尝试通过从success/failure
返回django view
消息,将success/failed message
作为json
并从django view
发回序列化的json来尝试这样做为此,我制作了xhr.open()
non-asynchronous
。我尝试打印xmlhttpRequest
对象的responseText
。console.log(xhr.responseText)
节目
response= {"message": "success"}
我想知道的是,这是否是正确的方法。在许多文章中,我发现了警告
建议不要使用async = false
那么,有没有办法找出文件是否已发送,同时保持xhr.open()
异步?
$(document).ready(function(){
$(document).on('change', '#fselect', function(e){
e.preventDefault();
sendFile();
});
});
function sendFile(){
var form = $('#fileform').get(0);
var formData = new FormData(form);
var file = $('#fselect').get(0).files[0];
var xhr = new XMLHttpRequest();
formData.append('myfile', file);
xhr.open('POST', 'uploadfile/', false);
xhr.send(formData);
console.log('response=',xhr.responseText);
}
我的django
视图从表单数据中提取文件并写入目标文件夹。
def store_uploaded_file(request):
message='failed'
to_return = {}
if (request.method == 'POST'):
if request.FILES.has_key('myfile'):
file = request.FILES['myfile']
with open('/uploadpath/%s' % file.name, 'wb+') as dest:
for chunk in file.chunks():
dest.write(chunk)
message="success"
to_return['message']= message
serialized = simplejson.dumps(to_return)
if store_message == "success":
return HttpResponse(serialized, mimetype="application/json")
else:
return HttpResponseServerError(serialized, mimetype="application/json")
编辑:
我在@FabrícioMatté的帮助下完成了这项工作
xhr.onreadystatechange=function(){
if (xhr.readyState==4 && xhr.status==200){
console.log('xhr.readyState=',xhr.readyState);
console.log('xhr.status=',xhr.status);
console.log('response=',xhr.responseText);
var data = $.parseJSON(xhr.responseText);
var uploadResult = data['message']
console.log('uploadResult=',uploadResult);
if (uploadResult=='failure'){
console.log('failed to upload file');
displayError('failed to upload');
}else if (uploadResult=='success'){
console.log('successfully uploaded file');
}
}
}
答案 0 :(得分:17)
以下代码应该可以完成这项工作:
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState === 4) {
var response = JSON.parse(xmlhttp.responseText);
if (xmlhttp.status === 200 && response.status === 'OK') {
console.log('successful');
} else {
console.log('failed');
}
}
}
答案 1 :(得分:13)
XMLHttpRequest
个对象包含status
和readyState
属性,您可以在xhr.onreadystatechange
事件中对其进行测试,以检查您的请求是否成功。
答案 2 :(得分:0)
XMLHttpRequest
提供了侦听请求处理过程中可能发生的各种事件的功能。这包括定期进度通知,错误通知等。
所以:
function sendFile() {
var form = $('#fileform').get(0);
var formData = new FormData(form);
var file = $('#fselect').get(0).files[0]
var xhr = new XMLHttpRequest();
formData.append('myfile', file);
xhr.open('POST', 'uploadfile/', false);
xhr.addEventListener("load", transferComplete);
xhr.addEventListener("error", transferFailed);
}
function transferComplete(evt) {
console.log("The transfer is complete.");
// Do something
}
function transferFailed(evt) {
console.log("An error occurred while transferring the file.");
// Do something
}
您可以了解有关Using XMLHttpRequest的更多信息。