web-dev-qa-db-ja.com

PHPダウンロード用のファイルを生成してリダイレクト

PHPアプリがあり、ヘッダーを使用してダウンロードを強制されるCSVファイルを作成します。コードの関連部分は次のとおりです。

_header('Content-Type: application/csv'); 
header("Content-length: " . filesize($NewFile)); 
header('Content-Disposition: attachment; filename="' . $FileName . '"'); 
echo $content;
exit(); 
_

私がやりたいのは、ファイルが作成され、ダウンロードプロンプトが送信された後に、ユーザーを新しいページにリダイレクトすることです。 header("Location: /newpage")を最後に追加するだけではうまくいきませんでしたので、どのようにリグするかわかりません。

59
Evan

私はこれができるとは思わない-私は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]
81
daremon

本当に必要な場合に非常に簡単です。

ただし、JavaScriptとCookieで少し作業する必要があります。

in PHP Cookieの設定を追加する必要があります

header('Set-Cookie: fileLoading=true'); 

次に、ダウンロードを呼び出すページで、JSで追跡する必要があります(たとえば、1秒に1回)Cookieが来ている場合(プラグイン jQuery cookie ここが使用されます):

setInterval(function(){
  if ($.cookie("fileLoading")) {
    // clean the cookie for future downoads
    $.removeCookie("fileLoading");

    //redirect
    location.href = "/newpage";
  }
},1000);

ファイルがダウンロードされ始めると、JSはそれを認識し、Cookieが削除された後に必要なページにリダイレクトします。

もちろん、クッキーやJavaScriptなどを受け入れるためにブラウザが必要であると言うことはできますが、動作します。

9
smnbbrv

送信するヘッダーはHTTPヘッダーです。ブラウザはそれをページ要求として受け取り、ページとして処理します。そして、あなたの場合、ダウンロードする必要があるページ。

そのため、リダイレクトヘッダーを追加すると、ファイルのダウンロードプロセス全体が混乱します(ヘッダーが収集され、1つのヘッダーに生成されてブラウザーに送信されるため、複数のリダイレクトヘッダーIIRCを設定してこれを試すことができます)

8
Ólafur Waage

ただし、IEユーザーのダウンロード可能なファイルの自動開始は、セキュリティ警告タブをトリガーします。daremonによって概説された3つの方法はすべて、この警告を表示します。実際のリンクを提供すれば、より良いサービスを受けることができます。

2
martar

JavaScriptに依存するこの回避策の1つを見つけたので、厳密には安全ではありませんが、安全でない重要なサイトでは機能しているようです。

ダウンロードスクリプトを指すように設定されたアクションを持つ「ダウンロード」というボタンのあるフォームを用意し、javascriptを使用して、ダウンロードボタンを削除して画面上のメッセージを置き換えるonsubmitハンドラーに何かを置きます。ダウンロードは引き続き行われ、画面が変更されます。明らかに、ダウンロードスクリプトに問題がある場合、それが起動しなくてもダウンロードは成功したように見えますが、それは私が今持っている最高のものです。

1
Darren Crabb

これは非常に古い問題ですが、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);

経由- https://www.daniweb.com/web-development/php/threads/463652/page-not-redirecting-after-sending-headers-in-php

1
Vaibhav Jain
<?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を使用したソリューションです。

1
nikksan

URLとファイルの内容を表すパラメーターにリダイレクトしてみてください。また、リダイレクトでは、ダウンロード用のファイルコンテンツを出力できます。

0
user1251795

以下を使用して、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ダウンロードプロンプトが表示されるウィンドウが開き、すぐにウィンドウが閉じて、プロンプトのみが残ります。

0
Clinton

答えは次のとおりです。
作業です!
次の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);
            }

        }
0
Hisham Dalal

うーん...

以下のコードをサイトのメインjavascriptに配置します。

 if (window.location.pathname == '/url_of_redirect/') {
        window.open(location.protocol + '//' + location.hostname + '/url_of_download.Zip', '_parent');
    }

説明:それはあなたが定義するいくつかのURLにPHPで通常のリダイレクトを行い、javasciptでは次のように言います:ダウンロード。

0
FernandoGiroto