2012-03-08 5 views
7

Tworzę wywołanie ajaxa do interfejsu API, który zwraca dane binarne. Zastanawiam się, czy możliwe jest pobranie tych danych binarnych i wyświetlenie ich dla klienta w nowym oknie? Właśnie to robię teraz. Problem polega na tym, że dokument otwiera się, ale jest całkowicie pusty.Pobierz dane binarne jako plik za pomocą kodu JavaScript

$.ajax({ 
    type: "POST", 
    url: apiURL, 
    data: xmlRequest, 
    complete: function(xhr, status) { 
     var bb = new window.WebKitBlobBuilder(); 

     // Append the binary data to the blob 
     bb.append(xhr.responseText); 

     var blobURL = window.webkitURL.createObjectURL(bb.getBlob('application/pdf')); 
     window.open(blobURL); 
    } 
}); 

Wszelkie pomysły?

+0

Czy używasz HTTPS z IE? Jeśli tak, zobacz http://stackoverflow.com/questions/773308/ie-https-generating-pdf-from-php-file-doesntwork –

+0

Jest to rozszerzenie chrome, więc nie muszę się martwić o IE. – Anton

+0

Czy kontrolujesz implementację po stronie serwera? –

Odpowiedz

7

Okej, wymyśliłem to. Musiałem określić parametr responseType jako "array buffer":

function downloadPDF() { 

    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', API_URL, true); 
    xhr.responseType = 'arraybuffer'; 

    xhr.onload = function(e) { 
     if (this.status == 200) { 
      var bb = new window.WebKitBlobBuilder(); 
      bb.append(this.response); // Note: not xhr.responseText 

      var blob = bb.getBlob('application/pdf'); 
      var blobURL = window.webkitURL.createObjectURL(blob); 

      window.open(blobURL); 
     } 
    }; 

    xhr.send(createRequest()); 
} 
+0

Jak zmienić nazwę pobranego pliku za pomocą tej metody? – Greg

+1

używanie FileSaver ułatwi http://stackoverflow.com/questions/15211742/html5-saveas-support-in-google-chrome – davyzhang