2012-06-04 44 views
14

我正在使用XMLHttpRequestjavascript代碼中的文件發送到django view。我需要檢測文件是否已發送或是否發生了某些錯誤。我使用jquery寫下面的JavaScript。如何找出XMLHttpRequest.send()是否工作

理想情況下,我想向用戶顯示該文件未上傳的錯誤消息。是否有某種方法可以在javascript中執行此操作?

我試圖從django view返回success/failure消息,把success/failed messagejson,併發送回從django view。爲此序列化JSON要做到這一點,我做了xhr.open()non-asynchronous。我試圖打印xmlhttpRequest對象的responseText .The console.log(xhr.responseText)顯示

response= {"message": "success"} 

什麼我不知道的,這是否是做this.In很多文章的正確方法,我發現了警告,

不建議使用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'); 
      } 
     } 
    } 
+1

'xhr.readyState == 4個&& xhr.status == 200'不足夠? –

+0

原諒我的無知,如果django視圖中的文件寫入失敗併發生服務器錯誤(500),我可以檢測到使用'xhr.readyState == 4 && xhr.status == 500'? – damon

+1

如果你的'xhr'對象返回一個響應,它應該包含'status'和'readyState'屬性。試着'console.log'來確保。 =] –

回答

10

XMLHttpRequest對象的幫助工作包含statusreadyState屬性,你可以在xhr.onreadystatechange事件來檢查,如果測試你的請求是成功的。

+0

答案在最後用一個工作代碼片段更新。 –

8

類似下面的代碼應該做的工作:

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'); 
     } 
    } 
}