2013-03-17 9 views
17

Ok, sagen wir, ich habe Dokumentdaten irgendwo gespeichert, lassen Sie uns willkürlich nehmen this pdf.Properly Erstellen und Servieren PDF-Blob über HTML5-Datei und URL-APIs

Ausgabe # 1. Ich möchte einen AJAX-Aufruf an diese URL senden (weil ich einige Authentifizierungsheader übergeben muss und es sich um eine Cross-Domain handelt). Nehmen Sie dann die zurückgegebenen Daten, erstellen Sie eine blob url dafür, hängen Sie einen iFrame an das DOM an und richten Sie die src an die Blob-URL.

Derzeit mein Code sieht wie folgt aus:

$.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); 
}); 

Leider bin ich ein 'Fehler beim Rendern PDF' in der iFrame bekommen.

Ausgabe # 2. Ich möchte, dass dies zu einer Aufforderung zum Herunterladen von Dateien führt. Ich bin mir nicht sicher, wie ich das garantieren kann, da PDFs natürlich nur im iFrame angezeigt werden.

+0

die Datenfolge wie folgt beginnt: '% PDF-1.5 % 2504 0 obj <> endobj 2511 0 obj <>/Filter/FlateDecode/ID []/Index [2504 10]/Info 2503 0 R/Length 47/Prev 3720769/Roo t 2505 0 R/Größe 2514/Typ/XRef/W [1 2 0] >> Strom h bbd'b'9 ] x? abP | ... '' –

+1

Nur FYI zu jedermann. Hat das Problem vollständig behoben, weil es nicht möglich schien. Am Ende habe ich die Dateien für 10 Sekunden vorübergehend bereitgestellt, indem ich einen iframe auf seine beliebige URL gerichtet habe und sie nach dem Download entfernt habe (keine Authentifizierung außer Browser-Cookies). –

Antwort

31

jQuery.ajax unterstützt derzeit keine Blobs, siehe bug report #7248, die als Wontfix geschlossen ist.

Allerdings ist es einfach, XHR für Blobs ohne jQuery zu tun:

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(); 

Schamlos von HTML5rocks kopiert.

Wenn jQuery den Blob-Typen unterstützen tut, könnte es so einfach sein wie:

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

Danke, es funktioniert. Was aber, wenn ich den Typ 'application/pdf' vorher nicht kenne? Kann ich den MIME-Typ aus der Antwort verwenden? – Yiping

+0

Wie kann ich es mit $ Ressource in eckigen arbeiten lassen? –

+0

Ja, Sie können Mimetype aus der Antwort verwenden. Beachten Sie jedoch, dass Ihnen diese Lösung * nicht * erlaubt, die Datei zu benennen, die die Leute am Ende herunterladen. Es wird immer ein böser Hasch oder sowas sein. – mlissner