2013-03-17 6 views
17

[OK]をクリックします。ドキュメントデータがどこかに保存されていれば、任意にthis pdfとしましょう。HTML5ファイルとURL APIを使用してBlobを適切に作成して配信する

問題#1。私がしたいことは、このURLへのAJAX呼び出しを行うことです(いくつかの認証ヘッダーを渡す必要があり、クロスドメインであるためです)。返されたデータを受け取り、blob urlを作成し、iFrameをDOMに追加して、srcをblob URLに転送します。

は現在、私のコードは次のようになります。

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

を残念ながら、私は取得していますインラインフレームに「PDFのレンダリングに失敗しました」。

問題#2。私はこの結果、ファイルダウンロードのプロンプトを表示したいと思います。 PDFが自然にiFrameに表示されるだけなので、これを保証する方法が不明です。

+0

: '%PDF-1.5 % 2504 0 OBJ << /線形1/L 3722399/O 2506/E 388168/N 36/T 3720768/H [462 773] >> endobj 2511 0 OBJ <> /フィルタ/ FlateDecode/ID [] /索引[2504 10] /情報2503 0 R/Length 47/Prev 3720769/Roo t 2505 0 R /サイズ2514 /タイプ/ XRef/W [1 2 0] >>ストリーム h bbd'b'9 ] x?abP | ... ' –

+1

誰にでもちょうどいいよ。可能ではないように見えるため、この問題を完全に解決しました。私は10秒間ファイルを一時的に提供し、iframeに任意のURLを指定し、ダウンロード後に削除しました(ブラウザのCookie以外の認証はありません)。 –

答えて

31

jQuery.ajaxは現在ブロブをサポートしていません。このbug report #7248はwontfixとして閉じています。

は、しかし、それはjQueryのせずに、ブロブのためのXHRを行うのは簡単です:

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

が臆面もなくHTML5rocksからコピー。

jQueryのBLOB型をサポートしていた場合、それは同じくらい簡単かもしれないとして:

データ列は次のように始まる
$.ajax({ 
    url:'http://www.grida.no/climate/ipcc_tar/wg1/pdf/tar-01.pdf', 
    dataType:'blob' 
})... 
+0

ありがとうございます、それは動作します。しかし、以前に「application/pdf」のタイプがわからないとどうなりますか?レスポンスのMIMEタイプを使用できますか? – Yiping

+0

$ resourceを使って動作させるにはどうすればよいですか? –

+0

はい、応答からmimetypeを使用できます。ただし、このソリューションでは、人々がダウンロードを終了させるファイルに名前を付けることはできません。それは常にいくつかの厄介なハッシュまたは何かになります。 – mlissner

関連する問題