web-dev-qa-db-ja.com

FAPIフォーム送信でCSVファイルをユーザーに送信する

ユーザーからいくつかの情報を収集し、CSVファイルを生成するFAPIフォームがあります。ユーザーがフォームで「エクスポート」をクリックすると、CSVがすぐにダウンロードされます。

ただし、送信ハンドラがCSV生成関数を呼び出すと、フォームはCSVを提供するのではなく、リダイレクトするだけです。

一時ファイルを生成せずに、このフォームでCSVをユーザーに直接提供する方法はありますか?

4
Chris Cohen

このブログ投稿のコード 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); 
 
6
Sivaji

次のルーチンは、ユーザーにファイルを「プッシュ」し、ブラウザに「ファイルの保存」ダイアログを表示させます。

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が安全なダウンロードを処理する方法からこのロジックを得ました。

2
Blake Senftner