17

珍しい要件があります。基本的に、ユーザーがリンクまたはボタンをクリックしたときに PDF を受け取る方法が必要です。ここで注意が必要なのは、カスタム ヘッダーが一緒に送信されない限り、サーバーはリクエストをまったく処理しないことです (そうしないと、ユーザーがログアウトしたと見なされ、ログイン画面に送信されます)。

現時点では、ヘッダーの動作を変更することはできないため、あまり気にしないでください。これは将来変更される予定であり、私が制御できない内部アプリケーションです。

私が検討したオプション:

  • iframe を使用するか、単に PDF を返す何らかのパスで新しいウィンドウを開きます。PDFに必要なヘッダーを指定できず、PDF自体に到達する前にリダイレクトされるため、これは機能しません。
  • カスタムヘッダーをフォームに追加できないため、フォームを使用してリクエストを送信できません(XHRとプラグインのみが可能です、AFAIK)。
  • XHR を使用すると、ヘッダーを追加してファイルを取得できますが、クライアント側に保存する方法がないため、機能しません。

この時点での唯一のオプションは、基本的に次のとおりです。

  • ファイルを要求するには、Flash や Silverlight などのプラグインを使用します。
  • ヘッダーが不要になるように、予想よりもはるかに早く要件の変更を強制します。

ここに欠けているものはありますか?私の知る限り、ここでできることは何もないので、誰かが私の調査結果を検証するか、私が見逃したことを指摘してくれることを願っています.

編集:これは適切なようで、私が考えていたことを確認します: XMLHttpRequest to open PDF in browser

4

2 に答える 2

13

クロムで動作するようにテスト済み:

function toBinaryString(data) {
    var ret = [];
    var len = data.length;
    var byte;
    for (var i = 0; i < len; i++) { 
        byte=( data.charCodeAt(i) & 0xFF )>>> 0;
        ret.push( String.fromCharCode(byte) );
    }

    return ret.join('');
}


var xhr = new XMLHttpRequest;

xhr.open( "GET", "/test.pdf" ); //I had test.pdf this on my local server


xhr.addEventListener( "load", function(){
    var data = toBinaryString(this.responseText);
    data = "data:application/pdf;base64,"+btoa(data);
    document.location = data;
}, false);

xhr.setRequestHeader("magic", "header" );
xhr.overrideMimeType( "application/octet-stream; charset=x-user-defined;" );
xhr.send(null);

application/pdf を application/octet-stream に変更すると、ダウンロード プロンプトが表示されます。しかし、Chrome のリーダーからダウンロードするのも非常に簡単です。

firefox では何も起こらないのは、対処するプラグインがインストールされていないためだと思いますapplication/pdf。application/octet-stream に変更すると、dl が表示されます。

IE では、ある種の VBScript/ActiveX ハッカーが必要だと思います。

ファイルが巨大な場合、データ uri を使用するとブラウザーがクラッシュする可能性があります。その場合、BlobBuilder とオブジェクト URL を使用できます。

于 2012-05-09T14:30:17.057 に答える
2

.PDF ファイルにリンクする代わりに、次のようなことを行います。

<a href="pdf_server.php?file=pdffilename">Download my eBook</a>

これは、カスタム ヘッダーを出力し、PDF (バイナリセーフ) を開き、データをユーザーのブラウザーに出力します。ユーザーは、ブラウザーの設定に関係なく、PDF を保存することを選択できます。pdf_server.php は次のようになります。

header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));   
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp);

編集:ブラウザー内 (クライアント側) から要求にヘッダーを追加する唯一の方法は、XmlHttpRequest setRequestHeader メソッドを使用することです。

xhr.setRequestHeader('custom-header', 'value');
于 2012-05-09T12:57:49.130 に答える