javascript - 如何查明 XMLHttpRequest.send() 是否有效

标签 javascript xmlhttprequest

我正在使用 XMLHttpRequest 将文件从 javascript 代码发送到 django View 。我需要检测该文件是否已被已发送或发生错误。我使用 jquery 编写了以下 javascript。

理想情况下,我想向用户显示文件未上传的错误消息。在 javascript 中是否有某种方法可以做到这一点?

我尝试通过从 django view 返回 success/failure 消息来实现此目的,并将 success/failed 消息 作为 json 并从 django View 发送回序列化的 json。为此,我将 xhr.open() 非异步 >。我尝试打印 xmlhttpRequest 对象的 responseTextconsole.log(xhr.responseText) 显示

response= {"message": "success"}

我想知道的是,这是否是执行此操作的正确方法。在许多文章中,我发现了警告

Using async=false is not recommended

那么,有没有什么方法可以在保持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 View 从表单数据中提取文件并写入目标文件夹。

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

最佳答案

像下面的代码应该可以完成这项工作:

    xmlhttp.onreadystatechange = function() {
      if (xmlhttp.readyState === 4) {
        var response = JSON.parse(xmlhttp.responseText);
          if (xmlhttp.status === 200) {
             console.log('successful');
          } else {
             console.log('failed');
          }
      }
    }

关于javascript - 如何查明 XMLHttpRequest.send() 是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10876123/

相关文章:

javascript - Protractor-flake 似乎重新运行所有测试,而不仅仅是失败的测试

javascript - 为什么我的按钮没有使用 ng-disabled 禁用?

angularjs - 如何将 eventHandlers 和 uploadEvntHandlers 与 angularjs 1 http 请求一起使用?

jquery - XHR 不起作用,因为 "Origin is not allowed by Access-Control-Allow-Origin"

javascript - IE 11 错误 - 访问被拒绝 - XMLHttpRequest

javascript - Fancy Box 无法使用,请帮忙

javascript - 使用javascript捕获音频数据

javascript - 路由获取参数和应用逻辑

javascript - 无法同时调用 API 和重定向