ユーザーからいくつかの情報を収集し、CSVファイルを生成するFAPIフォームがあります。ユーザーがフォームで「エクスポート」をクリックすると、CSVがすぐにダウンロードされます。
ただし、送信ハンドラがCSV生成関数を呼び出すと、フォームはCSVを提供するのではなく、リダイレクトするだけです。
一時ファイルを生成せずに、このフォームでCSVをユーザーに直接提供する方法はありますか?
このブログ投稿のコード http://sirkitree.net/node/2 が役立つと思います。基本的に、リダイレクトを防ぐために、送信ハンドラの最後でexit()またはdie()を使用する必要があります。
$ file = $ header。 "\ n"; foreach($ accounts as $ row){ $ file。= $ row。 "\ n"; } header( 'Cache-Control:must-revalidate、post-check = 0、pre-check = 0'); header( 'Content-Type:text/csv') ; header( 'Content-Disposition:attachment; filename = "users.csv"'); die(print $ file);
次のルーチンは、ユーザーにファイルを「プッシュ」し、ブラウザに「ファイルの保存」ダイアログを表示させます。
function _cex_download( $output, $filename )
{
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: private");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=$filename");
header("Accept-Ranges: bytes");
echo $output;
exit;
}
( 'cex'は私のカスタムモジュールの名前で、 '_ cex'はプライベート関数を示します。)
これを使用するには、文字列内でCSVファイルを生成し、これを呼び出すだけです。CSVの内容を$ outputに渡し、ブラウザーがファイル名を$ filenameとして保存するようにします。
私はもともと、Ubercartが安全なダウンロードを処理する方法からこのロジックを得ました。