0

私は一日中これに頭をぶつけていました。助けを求める時が来ました。

それで、ダウンロードページであるPHPスクリプトがあります。ユーザーは、注文した内容に応じてダウンロードできるファイルを持っています。

それは次のようになります(明らかに実際のコードではありません。いくつかのビットはそうです-うまくいけば要点を理解できます)

PAGE START
if(post[getorder]){

check order exists, get order filename etc from mysql;
update download attempts in db;

$ctype="application/force-download";
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers 
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
$handle = fopen($filename, "r");
while ( $contents = fread( $handle, 1024 ) )
{
print (  $contents );
flush();
}
fclose($handle);    
$successmessage = "Your download has begun";                  
}

if($successmessage){
 echo $successmessage;
}

get users order details from db;
display div
 display form with post to post order number to script; 
 end form
end div
END PAGE

うまくいけば、それは理にかなっています。それがより便利であれば、すべてのコードを入れることができますが、それは長い古いスクリプトであり、これはより便利かもしれないと思いました.

そのため、ユーザーがページを表示しているだけの場合、スクリプトは、ユーザーが持っている可能性のある注文に関する注文情報を取得します。ユーザーは、注文が完了して利用できなくなったというフラグが立てられる前に、ダウンロードを X 回試行するだけです。

利用可能な注文ごとに div が表示され、各 div 内には小さなフォームがあります。彼らがフォームをクリックすると、注文番号が同じスクリプトに戻されます。その時点で、ファイルを提供し、ページの残りの部分を表示し続けることを望んでいました。残念ながら、どうやら強制ダウンロードのヘッダーが制御を取得し、fclose の後に何も起こらないようです。

だから私はそれをバグだと思って、$sendfile = 1の行に沿って「if(post ...)」に変数を追加し、ページの一番下に...

if($sendfile == 1){ ヘッダー処理を行う}

...ファイルを送信する前にページが正しく読み込まれ、誰もが満足することを願っています。繰り返しますが、残念ながら違います。最初にファイルを提供し、ページをリロードしません。

繰り返しますが、うまくいけば、私の言い回しは何らかの意味を持ちます。

PHPスクリプトは最初にヘッダーを「実行」するので、ヘッダーをどこに置いてもかまいません。それが本当かどうかはわかりませんが、私が見ているものに基づいて、そうです。

また、fclose の後にヘッダーを使用して同じページにリダイレクトし、単純な GET を使用してスクリプトに成功メッセージを表示させようとしました。ただし、これを行うと、リロードは機能しますが、ダウンロード プロンプトは表示されません。自己へのリダイレクトの前に sleep(10) を置いても。待ってからリロードするだけですが、ファイルのダウンロードはありません。

ページの再読み込みは非常に重要です。ページの残りの部分が注文データを再取得して表示するときに、ダウンロードの試行回数を 1 回増やす必要があるためです。

私がやろうとしていることを達成する方法はありますか? 私がカットしているコードはますますハックになっているので、助けや提案があれば大歓迎です。

4

1 に答える 1

1

ダウンロードのランディングページで、<meta http-equiv="refresh" content="1; url=/download/file/url">ヘッダーを使用する代わりに追加してみてください。これにより、ブラウザがページをロードし、1秒後にファイルのダウンロードにリダイレクトされます。

さらに、小さなファイル以外のものを提供している場合は、X-Sendfileを確認することをお勧めします。

于 2011-11-21T12:21:28.510 に答える