2013-03-17 11 views
17

Ok, supponiamo di avere i dati del documento memorizzati da qualche parte, prendiamo arbitrariamente lo this pdf.Creare e servire correttamente Blob PDF tramite API file e URL HTML5

numero 1. Quello che voglio fare è fare una chiamata AJAX a questo URL (perché ho bisogno di passare alcune intestazioni di autenticazione ed è cross domain). Quindi prendi i dati restituiti, crea un blob url, aggiungi un iFrame al DOM e indirizza il src all'URL blob.

Attualmente il mio codice simile a questo:

$.ajax({ 
    url:'http://www.grida.no/climate/ipcc_tar/wg1/pdf/tar-01.pdf' 
}).done(function(data){ 
    var file = new Blob([data], {type:'application/pdf'}), 
     url = URL.createObjectURL(file), 
     _iFrame = document.createElement('iframe'); 
     _iFrame.setAttribute('src', url); 
     _iFrame.setAttribute('style', 'visibility:hidden;'); 
     $('#someDiv').append(_iFrame); 
}); 

Purtroppo, io sono sempre un 'Impossibile rendering PDF' nel iFrame.

numero 2. Mi piacerebbe che questo risultasse in un prompt di download del file. Non sei sicuro di come garantire questo dato che i PDF saranno naturalmente visualizzati solo nell'iFrame.

+0

la stringa di dati inizia in questo modo: '% PDF-1.5% 2504 0 obj <> endobj 2511 0 obj <>/Filtro/FlateDecode/ID []/Indice [2504 10]/Info 2503 0 R/Lunghezza 47/Prec 3720769/Roo t 2505 0 R/Dimensione 2514/Tipo/XRef/W [1 2 0] >> stream h bbd'b'9 ] x? abP | ... ' –

+1

Solo FYI a chiunque. Finito completamente lavorando a questo problema perché non sembrava possibile. Ho finito per servire temporaneamente i file per 10 secondi, puntando un iframe sul suo URL arbitrario e rimuovendoli dopo il download (nessuna autenticazione tranne i cookie del browser). –

risposta

31

jQuery.ajax attualmente non supporta BLOB, vedere questo bug report #7248 che viene chiuso come wontfix.

tuttavia è facile da fare XHR per blob senza jQuery:

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'http://www.grida.no/climate/ipcc_tar/wg1/pdf/tar-01.pdf', true); 
xhr.responseType = 'blob'; 

xhr.onload = function(e) { 
    if (this.status == 200) { 
    // Note: .response instead of .responseText 
    var blob = new Blob([this.response], {type: 'application/pdf'}), 
     url = URL.createObjectURL(blob), 
     _iFrame = document.createElement('iframe'); 

    _iFrame.setAttribute('src', url); 
    _iFrame.setAttribute('style', 'visibility:hidden;'); 
    $('#someDiv').append(_iFrame)   
    } 
}; 

xhr.send(); 

spudoratamente copiato da HTML5rocks.

Se jQuery ha fatto supportare il tipo di Blob, potrebbe essere semplice come:

$.ajax({ 
    url:'http://www.grida.no/climate/ipcc_tar/wg1/pdf/tar-01.pdf', 
    dataType:'blob' 
})... 
+0

Grazie, funziona. Ma cosa succede se non conosco il tipo 'application/pdf' in precedenza? Posso usare il tipo MIME dalla risposta? – Yiping

+0

Come posso farlo funzionare utilizzando $ risorsa in angolare? –

+0

Sì, è possibile utilizzare il mimetype dalla risposta. Si noti, tuttavia, che questa soluzione * non * consente di denominare il file che le persone finiscono per scaricare. Sarà sempre un pessimo hash o qualcosa del genere. – mlissner

Problemi correlati