2011-09-22 18 views
5

He creado un sencillo programa de descarga de código en .php (gracias a la ayuda de aquí) y estoy teniendo dificultades para tratar de averiguar cuál es la mejor manera de servir una descarga. si la validación es exitosa Básicamente -Publicación de descarga después del envío de formulario w/validation

El usuario introduce un código no válido -> La página se actualiza con un mensaje de error. El usuario ingresa un código válido -> Dar descarga 'Guardar como' -> página de actualización.

Por el momento estoy usando http://www.zubrag.com/scripts/download.php para servir el archivo, pero una vez que ha comenzado la descarga, mi formulario actualiza la página pero solo carga el contenido a la mitad?

Esta es la forma con el script PHP que hice.

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

¿Alguien tiene alguna idea sobre cuál sería la mejor forma de servir la descarga? Sé que actualmente cualquier persona que tenga la ubicación del archivo podría descargar el archivo, pero no estoy seguro de cómo podría protegerlo.

Respuesta

4

¡Me alegra que haya llegado hasta aquí!

Si va a redirigir al usuario a un script de descarga, ese script necesitaría tener algún tipo de token adjunto para evitar descargas no autorizadas, básicamente volver a verificar el código o token proporcionado.

En el guión anterior, en lugar de dar salida a la javascript para redireccionar al script descarga usted puede hacer esto:

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

El script descarga es probablemente similar a algunos de lo que tengo arriba. La clave de este ejemplo es que no se puede acceder desde la web al archivo que está sirviendo con file_get_contents. Solo lo envía cuando se ingresa un código válido.

+0

Hola otra vez dibujé, gracias, era un proyecto bastante útil. He intentado con la solución anterior, pero incluso si configuro el archivo $ en una ubicación accesible desde la web y cambio el nombre del archivo al que estoy apuntando, no se sirve ninguna descarga y la página se actualiza y ¡solo carga la mitad! – Bantros

+0

¿Está utilizando rutas absolutas o relativas? – dizas

+0

Cambié un poco la estructura de su código, porque si desea enviar encabezados, no se pueden generar html o espacios en blanco antes de hacerlo, especialmente si vamos a servir una descarga. ¿Hay algún otro HTML encima del bloque de código que envía los encabezados que no se muestran en el ejemplo? De ser así, asegúrese de que el script que sirve para la descarga no tenga otra salida antes de servir el archivo. Lamento no haber respondido antes, debo haber perdido el mensaje de la bandeja de entrada. – drew010

1

Tengo solo 1 pregunta rápida, ¿qué tan grande es este archivo? ¿Podría ser este el caso de que se esté experimentando el tiempo de espera de php al leer el archivo en el navegador?

Puede jugar con la configuración de php para confirmar esto (http://php.net/manual/en/function.set-time-limit.php).

Apenas mis 2 centavos

+0

Nunca pensé en eso, es un .zip alrededor de 250 MB – Bantros

Cuestiones relacionadas