Foros del Web » Programando para Internet » PHP »

Como controlar el numero de descargas reales de un fichero?

Estas en el tema de Como controlar el numero de descargas reales de un fichero? en el foro de PHP en Foros del Web. Hola a todos: Lo que quiero es, en vez de poner directamente el enlace a un fichero: <a href="ruta_fichero">Descargar fichero</a> ...donde no controlo nada, sino ...
  #1 (permalink)  
Antiguo 07/01/2005, 07:56
 
Fecha de Ingreso: marzo-2003
Mensajes: 6
Antigüedad: 21 años, 1 mes
Puntos: 0
Como controlar el numero de descargas reales de un fichero?

Hola a todos:
Lo que quiero es, en vez de poner directamente el enlace a un fichero:
<a href="ruta_fichero">Descargar fichero</a>
...donde no controlo nada,

sino hacerlo pasar por un script que me controle la cantidad de veces que este fichero ha sido descargado "completamente". Porque tampoco me vale que el usuario inicie la descarga y la detenga a mitad.
<a href="control_descargas?file=ruta_fichero">Descarg ar fichero</a>

¿Alguien tiene alguna idea? No se como hacerlo...
  #2 (permalink)  
Antiguo 07/01/2005, 08:14
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Y .. tienes pensado usar Base de datos (Mysql?) o .. archivos de texto plano? ..

En principio será ese "control_descargas.php" el que tiene que hacer dos procesos:

1) registrar tu descarga (contador incrementarlo)
Aquí decide si lo vas hacer con BD o con que ..

2) entregar el archivo para su descarga.
Con cabeceras HTTP enviadas desde funciones header() (www.php.net/header) y la función readfile() (www.php.net/readfile) lo podrás hacer.

Un saludo,
  #3 (permalink)  
Antiguo 07/01/2005, 08:22
 
Fecha de Ingreso: marzo-2003
Mensajes: 6
Antigüedad: 21 años, 1 mes
Puntos: 0
Esta todo preparado para controlarse desde MySQL.
Voy a echar un vistazo al punto 2 que comentas (que es el mas importante) porque es ahi donde tengo las dudas.
La cuestion esta en que no puedo invrementar el contador antes de nada, es decir, sin saber si el fichero ha sido descargado completamente. Osea, que yo creo que el orden deberia ser justo al reves. Cambiar el punto 1) por el 2).
Pero ya te digo, del punto 2) tuyo de momento no tengo ni idea, asi que mirare a ver esa funcion readfile() que me comentas.

Porque otra duda es que pasara si el usuario emplea un programa de descargas, tipo flashget, donde ya sabes que puede hacer una pausa y continuar mañana.

Uff.. creo que no es nada facil.
  #4 (permalink)  
Antiguo 07/01/2005, 09:08
 
Fecha de Ingreso: marzo-2003
Mensajes: 6
Antigüedad: 21 años, 1 mes
Puntos: 0
Bueno, pues del manual de PHP he extraido estas lineas de codigo:

fichero control_descargas.php
Código:
<?php
$file = 'ruta_a_mifichero';
header('Content-Description: File Transfer');
header('Content-Type: application/force-download');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename=' . basename($file));
readfile($file);

/************
Aqui, incrementar en MySQL el campo que controla el numero de descargas.
*************/
mysql_incrementa_descargas($file);
?>
Esto funciona, es decir, que efectivamente al pulsar el enlace, llevo al usuario a control_descargas.php?file=ruta_fichero pasandole la ruta del fichero a descargar.

Pero sigo teniendo la duda de cómo, cuándo y dónde debo llamar a la funcion mysql_incrementa_descargas($file); para aumentar en 1 el numero de descargas estando seguro de que el fichero esta completamente descargado.

Un saludo.
  #5 (permalink)  
Antiguo 07/01/2005, 10:15
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
No sé como tienes estructurada tu BD .. pero en algún sitio debes registrar los nombres de los archivos .. ya sea automáticamente o manualmanete.

Por ejemplo .. puedes hacer algo tipo:
1) .. primero consultar a tu BD si el archivo está registrado ...

Código PHP:
<?
// etc ... conexion a tu BD ..etc ..

// se consulta si existe el "archivo" registrado ..
$sql="SELECT COUNT(*) FROM tabla WHERE archivo='".$_GET['file']."'";
$resultado=mysql_result($sql,0);

if (
$resultado == 0){
   
//Si no está creado .. se crea.
   
$sql="INSERT INTO tabla (id,archivo,descargas) VALUES ('','".$_GET['file']."',1)";
    
msyql_query($sql);
} else {
    
// si existe .. se incrementa ...
    
$sql="UPDATE tabla SET descargas=descargas+1 WHERE archivo='".$_GET['file']."'";
    
mysql_query($sql);
}
?>
Sobre el tema de estar seguro de que la descarga se efectuó completa .. no lo vas a poder saber con seguridad .. PHP ya te he comentado que no tiene control sobre la "transferencia" de los archivos al cliente .. Tendrás que asumir ese riesgo. Usa al menos ese código despues de tus cabeceras HTTP (header() ...) por lo menos si falla por ahí tu script no se contabilizará .. No sé como se comportará con descargas en "pausa" pero tu código no tiene en cuenta la opción "resume" (en las FAQ's hay un ejemplo de descargas con esa opción ... ).

Un saludo,

Última edición por Cluster; 07/01/2005 a las 10:18
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:54.