2011-09-22 11 views
5

私は、ここで助けてくれてありがとうございます。ここで助けてくれてありがとうございます。ダウンロードコードリダイヤーを一緒に作成しました。検証が成功した場合。基本的に -フォーム提出後にダウンロードして有効にします

ユーザーが無効なコードを入力する - >ページがエラーメッセージとともに更新されます。 ユーザーが有効なコードを入力します - >ダウンロードを '名前を付けて保存' - >ページを更新します。

私はhttp://www.zubrag.com/scripts/download.phpを使用してファイルを配信していますが、一度ダウンロードが開始されると、私のフォームはページをリフレッシュしますが、コンテンツの半分しかロードしません。

これは私が行ったPHPスクリプトのフォームです。

<div class="dcrForm"> 
    <p>Have a physical copy of this release? Claim your digital download by entering your Download Code below.</p> 
    <form action="index.php" method="post"> 
     <input type="text" name="code" class="dcrInput" value=""> 
     <input type="submit" name="harrisSubmit" class="dcrSubmit" value="Submit"> 
    </form> 
<?php 
    include("scripts/dcr_config.php"); 
    $code=""; 
    $log=""; 

    if (isset($_POST['harrisSubmit'])) 
    { 
     $code=$_POST['code']; 

     $link = mysql_connect($hostname, $dbusername, $dbpassword); 
     mysql_select_db("$databasename"); 

     $query = "select count from $harris where code='$code'"; 
     if ($q=mysql_query($query)) 
      if ($r=mysql_fetch_array($q)){ 
       if ($r[0]<3) 
       { 
        $subquery="update $tbname set count='".($r[0]+1)."' where code='$code'"; 
        mysql_query($subquery); 
        ?><script>window.location.href="download.php?f=test.txt";</script><?php 
       } 
      } 
     $log="<p>Invalid code. Try Again.</p>"; 
    } 
    echo $log.""; 
?> 
</div> 

ダウンロードに最適な方法はありますか?現在のところ、ファイルの場所を知っている人なら誰でもファイルをダウンロードできますが、私はどのようにして私を保護することができるのか分かりません。

答えて

4

これまでにできてうれしいです!

ユーザーをダウンロードスクリプトにリダイレクトする場合、そのスクリプトに不正なダウンロードを防止するためのトークンが添付されている必要があります。これは基本的にコードまたはトークンの再確認です。上記のスクリプトで

、代わりにこれを行うことができ、ダウンロードスクリプトにリダイレクトするためにはJavaScriptを出力する:

<?php 

include "scripts/dcr_config.php"; 
$code = ""; 
$log = ""; 

if (isset($_POST['harrisSubmit'])) { 
    $code = trim($_POST['code']); 

    $link = mysql_connect ($hostname, $dbusername, $dbpassword); 
    mysql_select_db ("$databasename"); 

    $code = mysql_real_escape_string($code); // very important! protects against exploits 

    $query = "select count from $harris where code='$code'"; 
    if ($q = mysql_query ($query)) { 
     if ($r = mysql_fetch_array ($q)) { 
      if ($r [0] < 3) { 
       $subquery = "update $tbname set count='" . ($r [0] + 1) . "' where code='$code'"; 
       mysql_query ($subquery); 

       $file = '/path/to/protecteddownload.txt'; 

       // send file to browser as a download dialog 
       // no content can be output prior to these header() calls 
       header('Content-type: application/octet-stream'); 
       header('Content-Disposition: attachment; filename="file.txt"'); 
       header('Content-Length: ' . filesize($file)); 
       header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
       header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); 

       echo file_get_contents($file); 
       exit; // terminate script 
      } else { 
       $log = 'Sorry, this code has already been redeemed.'; 
      } 
     } else { 
      $log = 'Invalid download code. Try again.'; 
     } 
    } else { 
     // query failed 
     $log = 'An error occurred validating your code, please try again later.'; 
    } 

    $log = "<p>Invalid code. Try Again.</p>"; 
} 

?> 

<?php if (isset($log) && $log != ''): ?> 
<strong class="error"><?php echo $log ?></strong> 
<?php endif; ?> 

<div class="dcrForm"> 
<p>Have a physical copy of this release? Claim your digital download by 
entering your Download Code below.</p> 
<form action="index.php" method="post"><input type="text" name="code" 
    class="dcrInput" value=""> <input type="submit" name="harrisSubmit" 
    class="dcrSubmit" value="Submit"></form> 
</div> 

ダウンロード・スクリプトは、おそらく私は上記の持っているものの一部に似ています。 この例の重要な点は、file_get_contentsで提供しているファイルにWebからアクセスできないことです。有効なコードが入力されたときにのみ送信します。

+0

こんにちは、ありがとう、それはかなり役に立つプロジェクトでした。私はあなたの上記の解決策を試しましたが、Webからアクセス可能な場所に$ファイルを設定し、私が指しているファイル名に変更したとしても、ダウンロードは行われず、ページがリフレッシュされ、半分しかロードされません! – Bantros

+0

絶対パスまたは相対パスを使用していますか? – dizas

+0

あなたのコードの構造を少し変更しました。ヘッダーを送信したい場合、特にダウンロードを提供する場合は、その前にhtmlや空白を出力できないためです。このコードブロックの上に、例に示されていないヘッダーを送信する他のHTMLはありますか?その場合、ダウンロードを提供するスクリプトにファイルを提供する前に他の出力がないことを確認してください。前に応答しなかったことを申し訳ありません、私は受信トレイのメッセージを逃した必要があります。 – drew010

1

私はちょうど1つの簡単な質問があります、このファイルはどれくらい大きいですか?これは、ブラウザにファイルを読み込んでいるときにPHPのタイムアウトが発生している可能性がありますか?

これを確認するには、PHP設定で遊んでください(http://php.net/manual/en/function.set-time-limit.php)。

ちょうど私の2セント

+0

私はこれを考えなかった。約250MBの.zip – Bantros

関連する問題