2013-03-17 8 views
17

Ok, powiedzmy, że mam gdzieś zapisane dane dokumentu, zróbmy arbitralnie this pdf.Prawidłowe tworzenie i przesyłanie blobów PDF za pośrednictwem plików HTML5 i interfejsów URL API

Problem # 1. Co chcę zrobić, to wywołanie AJAX do tego adresu URL (ponieważ muszę przekazać niektóre nagłówki uwierzytelniania i jest to domena krzyżowa). Następnie odbierz zwrócone dane, utwórz dla nich blob url, dołącz element iFrame do DOM i skieruj src na adres URL blob.

Obecnie mój kod wygląda następująco:

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

Niestety, ja dostaję 'Nie udało się Render PDF' w iFrame.

Problem # 2. Chciałbym, aby to spowodowało monit o pobranie pliku. Nie wiesz, jak to zagwarantować, ponieważ pliki PDF będą wyświetlane w ramce iFrame.

+0

ciąg danych rozpoczyna się tak: '% 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/Rozmiar 2514/Typ/XRef/W [1 2 0] >> Strumień h bbd'b'9 ] x? abP | ... –

+1

Tylko dla każdego. Skończyło się całkowicie obejście tego problemu, ponieważ wydawało się to niemożliwe. Skończyłem wyświetlać pliki tymczasowo przez 10 sekund, wskazując element iframe na jego dowolny URL i usuwając je po pobraniu (bez uwierzytelniania innego niż pliki cookie przeglądarki). –

Odpowiedz

31

jQuery.ajax obecnie nie obsługuje obiektów typu blob, zobacz ten bug report #7248, który jest zamknięty jako wontfix.

Jednak jest to łatwe do zrobienia XHR dla bąble bez 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(); 

Bezwstydnie skopiowane z HTML5rocks.

Jeśli jQuery nie obsługuje typu Blob, to może być tak proste, jak:

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

Dziękuję, to działa. Ale co, jeśli nie znam typu "application/pdf" w poprzednim? Czy mogę użyć typu MIME z odpowiedzi? – Yiping

+0

Jak mogę sprawić, by działał przy użyciu $ resource in angle? –

+0

Tak, możesz użyć typu MIME z odpowiedzi. Pamiętaj jednak, że to rozwiązanie * nie * pozwoli ci nazwać pliku, który ludzie będą pobierać. To zawsze będzie jakiś paskudny haszysz czy coś takiego. – mlissner