2015-03-13 11 views
7

Jak wykonać wywołanie AJAX, które może zwrócić obiekt typu blob lub ciąg tekstowy w zależności od odpowiedzi serwera?Obsługa komunikatów o błędach podczas pobierania obiektu blob za pośrednictwem AJAX

Używam AJAX do konwersji wideo dostarczonego przez użytkownika do blobu audio (do użycia w tagu <audio>). Proces konwersji działa dobrze, ale zawsze jest możliwe, że coś może być nie tak z wideo, w którym to przypadku serwer zwróci kod stanu HTTP 500 z komunikatem o błędzie w treści odpowiedzi jako tekst jawny. W takim przypadku muszę czysty tekst odpowiedzi, ale stara się wykorzystać wyniki responseText w tym komunikatem o błędzie:

Uncaught InvalidStateError: Failed to read the 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' (was 'blob'). 

Oto uproszczona wersja mojego aktualnego kodu:

function convertToAudio(file) { 
    var form = new FormData(); 
    form.append("Video", file, file.name); 

    var request = new XMLHttpRequest(); 
    request.onreadystatechange = function() { 
     if(request.readyState == 4 && request.status == 200) { 
      console.log(typeof request.response); // should be a blob 
     } else if(request.readyState == 4 && request.responseText != "") { 
      console.log(request.responseText); 
     } 
    }; 
    request.open("POST", "video_to_audio", true); 
    request.responseType = "blob"; 
    request.send(form); 
} 

używam jQuery gdzie indziej w moim kodzie (więc odpowiedzi jQuery są dopuszczalne), ale o ile wiem jQuery nie obsługuje obiektów blob.

+1

dlaczego nie można ustawić jako '' responseType' „” 'następnie dokonać determinację o typie reakcji w oparciu o wartość zwróconego –

+0

@ArunPJohny Kiedy próbowałem, że zrobiła to samo, co "tekst" - to znaczy, 'request.response' zwrócił ciąg znaków. Czy pusty responseType ma zwracać blob w określonych warunkach? – Brilliand

+0

Co powiesz na zmianę statusu błędu. – Musa

Odpowiedz

8

Ustaw responseType gdy readyState to 2.

Wartość responseType mogą ulec zmianie w dowolnym czasie przed readyState osiągnie 3. Gdy readyState osiągnie 2, masz dostęp do nagłówków odpowiedzi, aby to decyzja z.

Updated przykładowy kod:

function convertToAudio(file) { 
    var form = new FormData(); 
    form.append("Video", file, file.name); 

    var request = new XMLHttpRequest(); 
    request.onreadystatechange = function() { 
     if(request.readyState == 4) { 
      if(request.status == 200) { 
       console.log(typeof request.response); // should be a blob 
      } else if(request.responseText != "") { 
       console.log(request.responseText); 
      } 
     } else if(request.readyState == 2) { 
      if(request.status == 200) { 
       request.responseType = "blob"; 
      } else { 
       request.responseType = "text"; 
      } 
     } 
    }; 
    request.open("POST", "video_to_audio", true); 
    request.send(form); 
} 
+0

Co za piękny interfejs! :) – shaunc

Powiązane problemy