如何找出XMLHttpRequest.send()是否有效

时间:2012-06-04 03:50:38

标签: javascript xmlhttprequest

我正在使用XMLHttpRequest将文件从javascript代码发送到django view。我需要检测文件是否已发送或是否发生了某些错误。我使用了jquery写下面的javascript。

理想情况下,我想向用户显示该文件未上传的错误消息。是否有某种方法可以在javascript中执行此操作?

我尝试通过从success/failure返回django view消息,将success/failed message作为json并从django view发回序列化的json来尝试这样做为此,我制作了xhr.open() non-asynchronous。我尝试打印xmlhttpRequest对象的responseTextconsole.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');
          }
       }
    }

3 个答案:

答案 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个对象包含statusreadyState属性,您可以在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的更多信息。