27

コードからXMLHttpRequestファイルを送信するために使用しています。ファイルが送信されたかどうか、またはエラーが発生したかどうかを検出する必要があります。jquery を使用して次の JavaScript を記述しました。javascriptdjango view

理想的には、ファイルがアップロードされなかったというエラー メッセージをユーザーに表示したいと考えています。これを行う方法はありjavascriptますか?

success/failureからメッセージを返し、 asをdjango view置き、シリアル化された json を から送り返すことで、これを実行しようとしました。オブジェクトの.The ショーを印刷しようとしましたsuccess/failed messagejsondjango viewxhr.open() non-asynchronousxmlhttpRequestresponseTextconsole.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');
          }
       }
    }
4

3 に答える 3

25

次のコードのようなものが仕事をするはずです:

    xmlhttp.onreadystatechange = function() {
      if (xmlhttp.readyState === 4) {
        var response = JSON.parse(xmlhttp.responseText);
          if (xmlhttp.status === 200) {
             console.log('successful');
          } else {
             console.log('failed');
          }
      }
    }
于 2016-06-06T22:05:43.090 に答える
18

XMLHttpRequestオブジェクトにはstatusおよびreadyStateプロパティが含まれており、xhr.onreadystatechangeイベントでこれらをテストして、リクエストが成功したかどうかを確認できます。

于 2012-06-04T04:22:00.993 に答える
2

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
    }

XMLHttpRequest の使用について詳しく読むことができます。

于 2019-11-09T15:25:19.703 に答える