PHPはダウンロード用のファイルを生成してからリダイレクトします
質問
ヘッダーを使用してダウンロードを強制されるCSVファイルを作成するPHPアプリがあります。コードの関連部分は次のとおりです。
header('Content-Type: application/csv');
header("Content-length: " . filesize($NewFile));
header('Content-Disposition: attachment; filename="' . $FileName . '"');
echo $content;
exit();
私がしたいのは、ファイルが作成され、ダウンロードプロンプトが送信された後、ユーザーを新しいページにリダイレクトすることです。最後にheader("Location: /newpage")
を追加するだけではうまくいきませんでしたので、これをどのようにリグするかわかりません。
解決
これができるとは思わない-100%確信はないが。
一般的なこと(たとえば、人気のあるダウンロードサイト)は逆です:最初に after ページに移動してから、ダウンロードを開始します。
だから、ユーザーを(特に)次のような final ページにリダイレクトします:
ダウンロードが自動的に開始されます。そうでない場合は、[a href="create_csv.php"]here[/a]
をクリックします。
ダウンロードの開始(例:create_csv.phpの自動呼び出し)に関しては、多くのオプションがあります:
- HTML:
[meta http-equiv="refresh" content="5;url=http://site/create_csv.php"]
- Javascript:
location.href = 'http://site/create_csv.php';
- iframe:
[iframe src="create_csv.php"][/iframe]
他のヒント
本当に必要な場合に行うのは非常に簡単です。
ただし、JavaScriptとCookieで少し作業する必要があります。
PHPでは、Cookieの設定を追加する必要があります
header('Set-Cookie: fileLoading=true');
ダウンロードを呼び出すページで、JSで追跡する必要があります(例:1秒に1回) jquery-cookie "rel =" noreferrer "> jQuery Cookie はこちら):
setInterval(function(){
if ($.cookie("fileLoading")) {
// clean the cookie for future downoads
$.removeCookie("fileLoading");
//redirect
location.href = "/newpage";
}
},1000);
ファイルがダウンロードされ始めると、JSはそれを認識し、Cookieの削除後に必要なページにリダイレクトします。
もちろん、Cookie、JavaScriptなどを受け入れるためにブラウザが必要であると言うことはできますが、動作します。
送信するヘッダーはHTTPヘッダーです。ブラウザはそれをページ要求として受け取り、ページとして処理します。そして、あなたの場合、ダウンロードする必要があるページ。
リダイレクトヘッダーを追加すると、ファイルのダウンロードプロセス全体が混乱します(ヘッダーが収集され、1つのヘッダーに生成されてブラウザーに送信されるため、複数のリダイレクトヘッダーIIRCを設定してこれを試すことができます)
ただし、IEユーザーがダウンロード可能なファイルを自動的に開始すると、セキュリティ警告タブがトリガーされることに注意してください。 daremonによって概説された3つの方法はすべて、この警告を表示します。これを回避することはできません。実際のリンクを提供すると、サービスが向上します。
JavaScriptに依存するこの回避策の1つを見つけたので、厳密には安全ではありませんが、安全でない重要なサイトでは機能しているようです。
ダウンロードスクリプトを指すように設定されたアクションを持つ「ダウンロード」というボタンのあるフォームを作成し、javascriptを使用して、ダウンロードボタンを削除して画面上のメッセージを置き換えるonsubmitハンドラーに何かを置きます。ダウンロードは引き続き行われ、画面が変更されます。明らかに、ダウンロードスクリプトに問題がある場合、それが起動しなくてもダウンロードは成功したように見えますが、それは私が今持っている最高のものです。
これは非常に古い問題ですが、JSを使用してこれを達成した方法は次のとおりです。
// Capture the "click" event of the link.
var link = document.getElementById("the-link");
link.addEventListener("click", function(evt) {
// Stop the link from doing what it would normally do.
evt.preventDefault();
// Open the file download in a new window. (It should just
// show a normal file dialog)
window.open(this.href, "_blank");
// Then redirect the page you are on to whatever page you
// want shown once the download has been triggered.
window.location = "/thank_you.html";
}, true);
<?php
function force_file_download($filepath, $filename = ''){
if($filename == ''){
$filename = basename($filepath);
}
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"" . $filename . "\"");
readfile($filepath); // do the double-download-dance (dirty but worky)
}
force_file_download('download.txt');
?>
<script type="text/javascript">
location = 'page2.php'
</script>
javascriptを使用したソリューションです。
ファイルの内容を表すパラメーターとパラメーターに加えて、URLにリダイレクトしてみてください。リダイレクトでは、ダウンロード用のファイルコンテンツを出力できます。
次を使用して、CSVダウンロードを含むPHPファイルを起動します。
<a onclick="popoutWin(\'csvexport.php\')" >Download CSV File</a>
または
<input name="newThread" type="button" value="Download CSV File"
onclick="popoutWin(\'csvexport.php\')" />
JavaScript関数popoutWin
の場所
/*
* Popout window that self closes for use with downloads
*/
function popoutWin(link){
var popwin = window.open(link);
window.setTimeout(function(){
popwin.close();
}, 500);
}
これにより、CSVダウンロードプロンプトを表示するウィンドウが開き、すぐにウィンドウが閉じられ、プロンプトのみが残ります。
答えは次のとおりです。
仕事だ!
コードの3つの異なる部分が必要です。
HTML
<a id="download_btn" class="btn btn-primary" href="?file=filename&download=1">Download<&/a>
JQuery
$('#download_btn').click(function(){
window.location.href = '<?=base_url()?>/?file=<?=$file;?>&download=1';
}).focusout (function(){
window.location.href = '<?=base_url()?>';
return false;
});
PHP
if(isset($_GET['download']) && isset($_GET['file'])){
$zip_path = 'path_to/'.$_GET['file'].'.zip';
if(file_exists($zip_path)){
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.basename($zip_path).'"');
header('Content-Length: ' . filesize($zip_path));
header('Location: '.$zip_path);
}
}
うーん...
サイトのメインjavascriptに以下のコードを挿入します。
if (window.location.pathname == '/url_of_redirect/') {
window.open(location.protocol + '//' + location.hostname + '/url_of_download.zip', '_parent');
}
説明: それはあなたが定義するいくつかのURLにphpで通常のリダイレクトを行い、javasciptでそれは言います:パス名がリダイレクトが「/ url_of_redirect /」を作ったパスと同じである場合、それは新しいページでURLを開き、ダウンロードを生成します。