web-dev-qa-db-ja.com

ファイルをユーザーに「プッシュ」した後にリダイレクトすることは可能ですか?

サイトの使用状況に関する内部分析をサイトが生成する設定があります。ユーザーは個人分析のダウンロードを要求できます。この情報は機密情報であるため、ファイルを作成していません。変数にCSVファイルを生成し、これをユーザーに「プッシュ」します。

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;
}

これにより、ユーザーのブラウザーは「ファイルの保存」ダイアログを表示し、ユーザーはファイルを作成します。サイトの管理者が「破壊的なエクスポート」をトリガーできることを除いて、これは正常に機能します。この状況では、破壊的なエクスポートを実行する前に管理者が受け入れる必要がある二次確認フォームがあります。

問題は、この「プッシュダウンロード」ルーチンがDrupalページの処理を終了することです。そのプッシュダウンロードルーチンが呼び出された後、管理者をあるページにリダイレクトする方法はありません。管理者は 'ブラウザでポップアップされた「ファイルを保存」ダイアログが表示されますが、確認フォームには残ります。

私はマルチステップフォームルートを試してみましたが、奇妙なリダイレクトで1日たたき回った後、私はその混乱から後退しました。 ChaosToolのマルチステップフォームロジックも検討し始めました。しかし、問題は本当にこの「プッシュダウンロード」がガイド付きプロセスキラーであるということです。

おそらく、最初の「エクスポート」ボタンのクリックをインターセプトするjquery確認ダイアログ、JavaScriptで完全に確認、php/FAPI確認フォームの作成を忘れ、ユーザーがjqueryで確認すると、インターセプトされたエクスポートをプログラムで送信しますか?

7
Blake Senftner

いくつかのトリックがあるようですが、それらがDrupal内でどの程度うまく機能するかはわかりません。

例を参照してください http://www.willmaster.com/blog/automation/one-link-download-and-redirect.php

2
Berdir

私の知る限り、それは不可能です。コンテンツ(この場合はファイル)を送信するか、リダイレクトすることができます。両方ではありません。これはHTTPプロトコルの制限です

3
Fuzzy76

ユーザーがフォームを送信するときにトークンを生成し、CSVファイルを生成するために必要なすべての情報をトークンに格納させるのが最善の策だと思います。フォームでユーザーを適切なページにリダイレクトし、drupal_set_message()を使用してトークンを含むリンクを提供します。

リンクをクリックすると、CSVファイルが生成され、その時点でユーザーに送信されます。確かに、フォームの送信時に生成するよりも複雑ですが、Fuzzy76が言うように、HTTPプロトコルの制限に反対しています。このようにすることは、JavaScriptベースのソリューションを作成するよりも簡単かもしれません。

2
Chris Cohen

これは私がDrupalで達成した方法です->私はJSを介してそれを達成しました、ここで私の正解を示します-> https://stackoverflow.com/ questions/822707/php-generate-file-for-download-then-redirect/25843144#25843144

0
Vaibhav Jain