2010-11-29 41 views
2

readfile()の後にページをリダイレクトすることはできますか?readfile()の後にページをリダイレクトすることはできますか?

私はヘッダーを使用しようとしましたが、動作しません。

header ("Content-Type: application/pdf"); 

header("Content-Disposition: attachment; filename=$file"); 
header("Content-Length: $size"); 

readfile($file_path); // Giving file to the customer 
// header('Location:../checkout.php'); Doesn't work 
// echo ('<meta http-equiv="refresh" content="1;url=../checkout.php">'); Doesn't work 
+1

不適切な方法でヘッダーを使用している可能性があるため、サンプルコードを投稿できますか?ありがとう! – Buggabill

+0

「お客様にファイルを渡す」とは何をしていますか?ダウンロードを開始しますか? –

+0

あなたが直面しているエラーメッセージは何ですか? "ヘッダー情報を設定することができません、ヘッダーはすでに送信されています..."(自明のはずです) – oezi

答えて

3

それは出力ヘッダすることは不可能です後、ファイルを出力を持っています。また、メタリダイレクトはどちらか動作しません。ヘッダーは最初に移動する必要があります(したがって、名前)。ファイルを出力する前にがヘッダーを出力すると、ブラウザはその本文を無視できます。私はブラウザが実際にはとは何かを知りませんが、リダイレクトの両方がリダイレクトされているとは思われませんファイルのダウンロードは同時に開始されます。どちらか一方はおそらく無視されるでしょう。

基本的な事実:ファイルのダウンロードと同じレスポンスで、ファイルのダウンロードに必要な情報とは別の情報を出力することはできません。ファイルダウンロード応答のヘッダーにはファイルに関する情報のみが含まれ、応答本体にはファイルのみが含まれます(つまり、<meta>がリフレッシュされていないと、の部分がになります)。最初の空白行の後

HTTP/1.1 200 OK 
Content-Type: application/pdf 
Content-Disposition: attachment; filename=foo 
Content-Length: 42 

woieufhm23umh29… (file contents as binary gibberish) …cQ3985fno1rHtn3f 
qo8923r10d30<meta http-equiv="refresh" content="1;url=../checkout.php"> 

すべては<meta>タグを含むファイルの内容として保存されます。説明するために

が、これはブラウザが受け取る何だろう。あなたは実際にを破損してファイルに追加コンテンツを出力して破損します。

通常、この方法は、ユーザーにダウンロードを開始する自動リフレッシュメタタグおよび/またはJavascriptを持つ「ダウンロードページ」をユーザーに提示することです。次に、2回目のリフレッシュリダイレクトを行います。

+0

リフレッシュヘッダーは、PHP経由で送信することもできます。実際のHTTPヘッダーを送信するのが容易でない時から、醜いmeta http-equivタグは必要ありません。 – ThiefMaster

+1

また、この質問を確認してください - http:// stackoverflow。com/questions/822707/php-generate-file-for-download-then-redirect – Buggabill

+0

@Thiefもちろん、ファイルダウンロードのリダイレクト*と*リダイレクト先を次のページに送るのは難しいです。その後、あなたはOPが持つ問題に直ちに到着します。 IMOのこれらのダウンロード後のリダイレクトページは完全に古いものであり、メタタグのリフレッシュはあまり悪いものではありません。 – deceze

0

あなたのコードはすぐにファイルの内容をユーザーに送信します。つまり、ダウンロードが開始されます。 ダウンロードを開始して別のページを表示する場合は、ページを表示して - このページで - このヘッダーを送信します。header('Refresh: 2;url=url/to/your/download');

ブラウザがダウンロードを開始するため、表示されたページからリダイレクトされません。

1

回避策がありました。 target="_blank"で開いたファイルを送信するページ、最初のページにonclick javascriptのリダイレクトまたは表示divを行いました。

ファイルを送信するために開くページがダウンロードを開始し、inmediatly終了します。

これが役に立ちます。

関連する問題