2017-11-23 5 views
8

PDFを作成するのに少し時間がかかるPDFエクスポートがあります。ユーザーにエクスポートリンクをクリックさせてすぐにダウンロードダイアログを表示させたい。これにより、ダウンロードを開始して完了するまで待つことができます。リンクをクリックするのではなく、世代を待ってからダウンロードをもう一度待ちます。ヘッダを受信した直後にダウンロードダイアログを表示する

はここでPHPに非常に単純な例です:

<?php 

header('Content-Type: application/pdf'); 
header('Content-Disposition: attachment; filename=test.pdf'); 
flush(); 

// time consuming PDF creation happens here 
sleep(15); 
echo 'pdf contents would be here'; 

アイデアはゆっくりと、ブラウザに、フラッシュ()、それらを適切なヘッダを送信するPDFを作成し、最終的にそれをブラウザに送信することです。

これはクロムで完全に機能します。ダウンロードダイアログが即座にポップアップし、スリープはダウンロード待ち時間の一部です。

FirefoxとInternetExplorerでは、これは機能しません。これらのブラウザはダウンロードダイアログを表示する前に15秒間待機します。

ダウンロードダイアログをすぐにポップアップさせるには、どんな考えがあれば大歓迎です。

答えて

2

ブラウザによっては、ダウンロードダイアログを表示する前に実際のコンテンツを待つものがあります。 解決方法は簡単です.PDFコンテンツを作成する前にPDFコンテンツを送信してください。

お待ちください。 あなたはそれを手に入れる前に何を送っていますか? タイムマシンが必要なようですね。 心配する必要はありません。周りを回る方法があります。

PDF content starts with %PDFです。したがって、flush()を呼び出す前に%PDFを送信するだけで済みます。 PDFの作成が完了したら、新しく作成したPDFコンテンツの最初の4バイトをエコーする前に削除します。

<?php 
// disable output buffering 
while (@ob_end_clean()); 

header('Content-Type: application/pdf'); 
header('Content-Disposition: attachment; filename=test.pdf'); 

// send some content to trigger the download dialog 
echo '%PDF'; 
flush(); 

// time consuming PDF creation happens here 
sleep(15); 
$pdfContent = '%PDF-pdf contents would be here'; 
echo substr($pdfContent, 4); 

このソリューションは、PHPのみの機能に依存しないため、どの言語でも機能します。

絶対最小値を指定する場合は、1バイトの%を送信し、エコーする前に最初のバイトだけを削除することもできます。 同じ結果です。

+0

。私はこれをもう一度試しましたが、うまくいきません。確かに、私はあなたのコードをFirefoxでもう一度試しました。それはまだ15秒待ってからダウンロードダイアログをポップアップします。 –

+0

@AndreasGohr出力バッファリングが無効になっているので、あなたは 'flush()'だけを使っていると仮定しました。それが機能しないという事実は、あなたが持っていないことを意味します。出力バッファリングの設定に関係なく動作するようにコードを更新しました。 – Rei

+0

奇妙な。あなたが正しいです、私は出力バッファリングが有効になっていないと思ったが、あなたの追加でそれは動作します!どうもありがとう! –

0

これは一般的な問題であり、特定の言語には関係しません。 PDF生成が行われるまでしばらく待ってから、ダウンロードプロセスを開始するプロセスを作成しています。

したがって、PDF生成を待つために、sleep()関数を使用して、指定された期間(15日間)プロセスを待機させます。

sleep(15) 

は、今、私たちはないflush()空のコンテンツ頭の前にPDFがブラウザに生成されることができます。だから私たちは頭の前にいくつかの静的なコンテンツを送信し、フラッシュプロセスを開始することができます。

PDF生成に成功した後、以前に追加されたコンテンツを削除し、更新されたコンテンツをブラウザのflush()関数にエコーすることができます。

ので、全体的なコードは次のようになり、あまりにも、私の推測だった

<?php 

// Initialize the Basic Header 

ob_start(); // Start Buffering 
header('Content-Type: application/pdf'); 
header('Content-Disposition: attachment; filename=test.pdf'); 

// Adding content before the PDF Generation Process 
echo 'demo'; 

// Flushing content to the Browser 

ob_end_flush(); 
ob_flush(); 
flush(); 

// time consuming PDF creation happens here 
sleep(15); 

$Content = 'demoother pdf content'; 

// Removind the Added Content 
echo substr($Content, 4); 

?> 
+0

"*したがって、PDF Generationを待つために、sleep()関数*を使用します。これは、問題の 'sleep()'の目的ではありません。程遠い。質問をもう一度読んで、まだ理解していないかどうか尋ねてください。 – Rei

関連する問題