2016-10-31 3 views
2

クライアント側にダウンロードボタンがあります。 ボタンがクリックされた後、ダウンロードを開始するために、いくつかのヘッダがPHPでサーバに設定されます。ヘッダーを設定した後に文字列をクライアントに返す方法

//code snippet: 
$filename = basename($datei); 

$size = filesize($datei); 
$this->response->setHeader('Content-Type', "application/force-download", TRUE); 
$this->response->setHeader('Content-Disposition', 'attachment; filename='.$filename , TRUE); 
$this->response->setHeader('Content-Length', $size, TRUE); 

return "TEST"; //<--code will never go this far, it is ignored 

ダウンロードが機能します。しかし、私は応答として返されるものは得られませんが、ヘッダーです。 どうすれば返品できますか?ダウンロードが開始された後の文字列?

ヘッダーを設定した後にクライアントに何かを返すことは不可能なようです。


背景

基本的に私の目標は、例えば、スピナーアイコンを表示し、非表示にしましたファイルがまだダウンロードされている間にダウンロードボタンの中にスピナーアイコンを表示し、ダウンロードが終了した後で再び非表示にします。そのため、ダウンロードが完了したかどうかを知るためには、サーバーからクライアントに何かを返すだけで、クライアントに知らせることができます。 "ダウンロードに成功しました"。

しかし、これがうまくいくかどうかわからない場合は、ダウンロードが完了する前に応答が到着している可能性があります。

+0

この質問を読んでいる人なら、私は様々な編集や悪い言い方で混乱しています。 - ヘッダーを設定した後に文字列を返すことができます。 ( "echo"を使用し、コードで "return"を使用しないでください)。 - 1つのダウンロードファイルと別の文字列の両方を送信し、JSプロセスで処理することができます。 (例はコメントには長すぎます;注意点もあります)。 - ダウンロードヘッダーを使用し、別の文字列をJSで別の処理に追加することはできません(答えが選択されたように)。しかし、ワークウォンドがあります(答えに記載されているように別ウィンドウで開きます)。 – Robbie

+0

私はいつも「この要求には利用可能な応答データがありません」と表示されます。私は 'echo'と' return'を試しましたが、ダウンロードは開始されます。 – Black

+1

それはうまくいく - エコーはダウンロードに追加されますが、あなたがしようとしているものに実際にぶつかりますが、あなたが尋ねたことをします。あなたが何をしたいのですか(つまり、ダウンロードが始まるか、プログラムが始まるときのJSのやりとり)、Javascript用のストリーミングAPI(IE10 +をサポートしていると思いますか?)を見て、ファイルをデータストリームおよび追加情報これはあなたの呼び出しですか、ダウンロードが始まるとただちに分岐することができます)。 saveAsを使用してデータのファイル部分を保存します。他のブラウザではフォールバックが必要で、動作させるには少し遊んでください。 – Robbie

答えて

2

あなたことができません。ハックを探すのに時間を費やすのではなく、それに応じてダウンロードページを設計してください。

あなたはその後、彼らはドン、あなたはその後、すべてのごく最近のブラウザでは、そのアドバイスに従うと、ファイルをダウンロードします

ここのような
$this->response->setHeader('Content-Type', "application/force-download", TRUE); 

をダウンロードするファイルを提供しようとしている(ヘッダを使用して)ブラウザに指示PHPが何かを最後にエコーすることができれば、必要ない。

あなたのPHPコードはで、無視されていません、それはうまく処理されています。 PHPは、ブラウザにいくつかのヘッダを提供した後でコードを取得することを止めません。そのファイルをダウンロードして戻すことをクライアントに伝えたら、出力したい他のテキストを気にしません。実際、それはダウンロードファイルの一部とみなされます。このコンテンツでは役に立たないreturnがありますので、ファイルには表示されません。echoをお試しください。

コンテンツタイプヘッダーを入力すると、ブラウザがサーバーの応答を正常に理解できるようにするには、そのタイプのコンテンツを送信することが必要です。

ほとんどすべてのダウンロードサイトを参照してください。ダウンロードリンクをクリックすると、と表示された別のページにリダイレクトされます。とその間に彼らはダウンロードページへの別の要求を開始します。ダウンロードするファイルを提供します。

1つのリクエストでは、ブラウザの互換性があれば、2つを混在させることはできません。

+0

基本的に私の目標は、スピナーアイコンを表示したり隠したりすることでした。ファイルがダウンロードされている間にボタンにスピナーアイコンを表示し、ダウンロードが終了したら再度非表示にします。 – Black

-1

まあ、私はMVCフレームワークを使用していますし、私のコントローラで、私はこれを実行し、ダウンロードが開始されたところから再ロード親ページへの必要性がない方法があります:

// Define headers 
header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 
header("Content-Disposition: attachment; filename=$file_name"); 
header("Content-Type: application/zip"); 
header("Content-Transfer-Encoding: binary"); 
// Read the file 
readfile($filePath); 
exit; 
+0

私にとっては、ダウンロードはリロードなしでも動作しません。しかし、ダウンロードが開始された直後に、他の理由でリロードする必要があります。 – Black

0

現在のスクリプトを終了するにはreturnを使用することができますが、最上位レベルのスクリプトで使用すると、実行を終了しますが、は戻り値を返さず、HTTP応答の一部として何も出力しません。これにはexitが必要です(後で参照してください)。

returnは、スクリプトだけを呼び出すに戻す値を渡すことができます:

  • 必要/ includeに使用された場合、それは/が必要とバックに使用した場合
  • スクリプトを呼び出すに値を渡す含まれていることを終了します機能、それは、その関数を終了し、バックHTTP応答の一部として現在のスクリプトと出力値を終了するには

スクリプトを呼び出すに値を渡しますexithttp://php.net/manual/en/function.exit.php)またはdie(exitと同じ)を使用することができます。あなたは、パラメータを渡すときにはexitは、その動作を変更することができます

  • を整数で、それはコマンドライン用(終了コードとしてこれを使用する場合、文字列は、それがHTTPレスポンス
  • の一部として送信されます場合には使用法)。取得するための出力何にも

echoを使用して、HTTP応答の一部として "返却しました"。 (http://php.net/manual/en/function.echo.php)。これは、文字列に変換できるものを出力します(つまり、整数または文字列を出力する場合)、整数または文字列がexitの場合は動作を変更しません。


最も安全なオプションは、そのためです:

  • は常に実行を終了するexitを使用し、常にHTTPレスポンス
  • の一環として、背面に何かを送信するためにechoを使用します。あなたが知っている機能やファイルの内部
  • 使用のリターンは、「含まれる」ことになる(必要に応じて、戻り値を返すため)

理想的には(コード内の潜在的なambiguationを回避するため)HTTPレスポンスのため、追加しないでくださいコマンドラインインターフェイス用にプログラミングしていない限り、値を返してください。あなたがファイル(とないあなたは、メモリを持っている変数)を出力している場合、すなわちHTTPのために、

// Outputs something and exists 
echo 'TEST'; 
exit; 

または

// Outputs something and exists 
echo 1; 
exit; 

を使用readfile()http://php.net/manual/en/function.readfile.php)を見た出力A意志ファイルストリームをHTTP応答に送信します。 (exit;が続く)

// Outputs a file to HTTP response 
readfile('/path/To/My/File/MyFile.txt'); 
exit; 

*ボーナスノート:exitechoreturnは、それ自体、機能ではなく、言語構造です。 exitおよびreturnの戻り値は、括弧内に指定しないでください。それはうまくいくでしょうが、PHPのマニュアルではこれをお勧めします。 echoはパラメータを使用することができます。出力する値を複数渡す場合は、実際には必要です。

誤:

  • 出口( 'TEST')。
  • return( 'TEST');

正しい:

  • 出る 'TEST';
  • return 'TEST';
  • echo 'TEST';
  • エコー( 'TEST'、 'MORE')、
+1

私はOPがそれを知りたかったとは本当に思いません。 OPはダウンロードファイルといくつかのテキスト出力を1つのhttpレスポンスで提供する方法を知りたいです。 –

+0

私は直接質問に答えました。つまり、TESTを返すのはなぜですか?しかし、OPはこの問題を最初の草案から大幅に変更しました。問題を解決しようとする問題でなければ、新しい質問が開かれます。 – Robbie

+0

私はそれを理解しています。私は改訂履歴を見ませんでした –

関連する問題