2011-09-22 17 views
5

Stworzyłem razem całkiem prosty Odkupiciela kodu w .php (dzięki pomocy od tego miejsca) i mam trudność w ustaleniu, jaki jest najlepszy sposób na pobranie pliku jeśli walidacja się powiedzie. Zasadniczo -Serwery do pobrania po przesłaniu formularza w/sprawdzanie poprawności

Użytkownik wprowadza nieprawidłowy kod -> Strona jest odświeżana z komunikatem o błędzie. Użytkownik wprowadza poprawny kod -> Podaj pobranie "Zapisz jako" -> odśwież stronę.

W momencie, w którym używam pliku http://www.zubrag.com/scripts/download.php, ale po rozpoczęciu pobierania mój formularz odświeża stronę, ale tylko połowa ładuje zawartość ?!

To jest formularz ze skryptem PHP, który zrobiłem.

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

Czy ktoś ma pomysły na to, jak najlepiej służyć do pobrania? Wiem, że obecnie każdy, kto miał lokalizację pliku, mógł pobrać plik, ale nie jestem pewien, jak mógłbym zabezpieczyć i

Odpowiedz

4

Cieszę się, że dotarłeś tak daleko!

Jeśli zamierzasz przekierować użytkownika do skryptu pobierania, skrypt ten musiałby mieć dołączony jakiś token, aby zapobiec nieautoryzowanym pobraniom, w zasadzie ponownie zweryfikować podany kod lub token.

W powyższym skrypcie zamiast wyprowadzania JavaScript przekierować do skryptu pobierania można to zrobić:

<?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> 

Skrypt pobierania jest prawdopodobnie podobna do niektórych, co mam powyżej. Kluczową rzeczą w tym przykładzie jest to, że plik, który wyświetlasz z file_get_contents, nie jest dostępny z internetu. Wysyłasz je tylko po wprowadzeniu poprawnego kodu.

+0

Cześć ponownie narysowałem, dzięki, był to bardzo przydatny projekt. Próbowałem Twojego powyższego rozwiązania, ale nawet jeśli ustawię plik $ w lokalizacji dostępnej z sieci i zmieni nazwę pliku na tę, na którą wskażę, pobieranie nie będzie obsługiwane, a strona odświeży się i załaduje tylko połowę! – Bantros

+0

Czy używasz ścieżek bezwzględnych lub względnych? – dizas

+0

Zmieniłem nieco strukturę twojego kodu, ponieważ jeśli chcesz wysyłać nagłówki, nie możesz wypuścić html lub białych znaków, zanim to zrobimy, szczególnie, jeśli mamy służyć do pobrania. Czy jest inny kod HTML powyżej tego bloku kodu, który wysyła nagłówki, które nie zostały pokazane w przykładzie? Jeśli tak, upewnij się, że skrypt obsługujący pobieranie nie ma innych danych wyjściowych przed udostępnieniem pliku. Przepraszam, że nie odpowiedziałem wcześniej, ale przegapiłem wiadomość w skrzynce odbiorczej. – drew010

1

Mam tylko jedno szybkie pytanie, jak duży jest ten plik? Czy może to być przypadek, w którym nastąpił czas oczekiwania na php podczas czytania pliku do przeglądarki?

Można to obejść dzięki ustawieniom php, aby to potwierdzić (http://php.net/manual/en/function.set-time-limit.php).

Po prostu moje 2 centy

+0

Nigdy nie myślałem o tym, jest to .zip około 250 MB – Bantros

Powiązane problemy