Introducción

Hoy os traigo como cuantificar las descargas que tienen nuestros archivos públicos, este sistema es el que uso yo en esta misma web.

Lo que vamos a hacer es redirigir los archivos a través de un fichero PHP que sera el que contabilice el Nº de descargas.

Por ejemplo,

Para el archivo ConsultaCorreos.zip teniamos una URL como la siguiente:

http://midominio.com/Descargas/ConsultaCorreos.zip

Ahora tendríamos que hacer un enlace a downloads.php pasandole el fichero ConsultaCorreos.zip

http://midominio.com/downloads.php?file=ConsultaCorreos.zip

undefined

Ejemplo Practico

Código de PHP del archivo downloads.php
<?php
	//TODO: Validación de los parametros
	$file_name=$_GET["file"];
	
	//DIRECTORIO DE LAS DESCARGAS
	$dir_downloads="./Descargas/";
	
	//FICHERO DEL CONTADOR DE DESCARGAS, EN ESTE SISTEMA SE UTILIZA UN FICHERO CONTADOR POR CADA FICHERO A DESCARGAR
	$file_name_count="./Descargas/".$_GET["file"].".count";
	
	//LEEMOS EL CONTENIDO DEL FICHERO CONTADOR "nombrefichero.count"
	$hit_count = @file_get_contents($file_name_count);
	if ($hit_count==""){//SI ESTA VACIO, LO INICIALIZAMOS
		$hit_count=1;
	}else{//SINO, LO AUMENTAMOS
		$hit_count++;
	}
	
	//GRABAMOS DE NUEVO EL CONTADOR
	@file_put_contents($file_name_count, $hit_count);

	//REDIRIGIMOS AL FICHERO
	header('Location: '. $dir_downloads . "/". $file_name);
?>

 

Código de PHP del archivo EjemploVisor.php
<?php
	//FICHERO A DESCARGAR
	$download_file="ConsultaCorreos.zip";
	
	//TEXTO A MOSTRAR
	$download_text="Programa de Ejemplo";
	
	//COSNTRUIMOS LA URL DE LA DESCARGA
	$download_url="./downloads.php?file=".$download_file;

	//CONTRUIMOS FICHERO CONTADOR
	$file_name_count=$download_file.".count";
	
	$download_count=@file_get_contents($file_name_count);
	
	//PINTAMOS COMO QUEREMOS MOSTRAR LA DESCARGA
	echo '
		<div class="title-bar"> 
			<div class="avatar-sm-container pull-left"><img src="https://secure.gravatar.com/avatar/b64518ca2a465c3ef67299a39758c383?s=100&amp;r=g&amp;d=mm" class="img-rounded user-avatar-sm"></div>
			<h4>
				"' . $download_text . '"<br>
				<small>
					Descargas: ' . $download_count . '
					<a href="' . $download_url . '" title="' .$download_text . '" target="_blank">
						Descargar
					</a>
				</small>
			</h4>
			<div class="clearfix"></div>
		</div>
	';
?>

A partir de aquí podríamos implementar una seguridad si fuera necesario para que solo los usuarios que estén identificados en nuestra web puedan descargar los archivos.

Para ello una de las cosas que abría que cambiar es en vez hacer header('Location: '. $dir_downloads . "/". $file_name); ya que se podría analizar el trafico de red y saber la URL real del fichero que descargamos.

El código podría ser algo como este, esta sacado de StackOverFlow(http://stackoverflow.com/a/11316004):

$file = "RUTA DEL FICHERO EN EL SERVIDOR";

if (file_exists($file)) {
  header('Content-Description: File Transfer');
  header('Content-Type: application/octet-stream');
  header('Content-Disposition: attachment; filename='.basename($file));
  header('Content-Transfer-Encoding: binary');
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');
  header('Content-Length: ' . filesize($file));
  ob_clean();
  flush();
  readfile($file);
  exit;
}