2012-03-08 19 views
7

Estoy haciendo una llamada ajax a una API que devuelve datos binarios. Me pregunto si es posible tomar esos datos binarios y mostrarlos para el cliente en una nueva ventana. Esto es lo que estoy haciendo en este momento. El problema es que el documento se abre, pero está completamente en blanco.Descargar datos binarios como un archivo a través de 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); 
    } 
}); 

¿Alguna idea?

+0

¿Estás utilizando HTTPS con IE? Si es así, vea http://stackoverflow.com/questions/773308/ie-https-generating-pdf-from-php-file-doesnt-work –

+0

Es una extensión de Chrome, así que no tengo que preocuparme por IE. – Anton

+0

¿tiene usted el control de la implementación del servidor? –

Respuesta

7

Bien, lo descubrí. Tuve que especificar el tipo de respuesta como '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

¿Cómo se cambia el nombre del archivo descargado con este método? – Greg

+1

usando FileSaver lo hará más fácil http://stackoverflow.com/questions/15211742/html5-saveas-support-in-google-chrome – davyzhang

Cuestiones relacionadas