TRASLOCO
Sempre mosso dalla voglia di allontanarmi da Google e dai suoi servizi, ho finalmente deciso che dopo diversi anni la piattaforma di questo piccolo spazio andava cambiata. Finalmente il blo cambia casa. Se volete trovarmi potete recarvi al nuovo indirizzo

venerdì 13 novembre 2009

Didattica PHP: Contare i download di file


Hai un sito vuoi sapere quante volte un tuo file è stato scaricato? Ecco un pratico script che sfrutta i file di testo per poter salvare il numero di download dei vostri file. Il file richiede un file di testo per ogni file ma evita l'uso di database.

Vediamone il codice e analizziamone i passaggi:

// Ottengo il riferimento del file da scaricare
$file=$_GET['f'];

// Se non esiste già, creo la directory 'reports'.
// Qui andranno tutti i file generati con
// i counter dei vari file
if(!is_dir('reports')) {
mkdir('reports', 0777);
chmod('reports', 0777);
}

// Definisco il nome del file report
$filename='reports/'.basename($file).'.txt';

// Se il file del report esiste già, mi occupo di ottenerne il contenuto
// viceversa, definisco il counter a 0
if(file_exists($filename)) {
$handle=fopen($filename,'r');
$counter=fread($handle, filesize($filename));
fclose($handle);
} else {
$counter=0;
}

// Incremento il counter di 1, quindi scrivo il valore ottenuto nello stesso
// file, sovrascrivendone il contenuto.
$counter++;
$handle=fopen($filename, 'w+');
fwrite($handle, $counter);
fclose($handle);
chmod($filename, 0777);

// Infine, dispongo gli header per il donwload e istruisco il parser
// sul file da far scaricare all'utente.
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Content-Transfer-Encoding: binary');
readfile("$file");
exit;

Inizialmente diciamo allo script mediante $_GET di prelevare il link che verrà passato come argomento e di salvarlo nella variabile $file. Fatto ciò controlliamo mediante is_dir se esiste la cartella report dove verranno salvati i file di testo di ogni file contenti i numeri di download. Se essa non esiste ne crea una nuova e mediante chmod le associa il permesso 0777. Ora lo script si appresta a creare la stringa, che fungerà da nome per il file di testo, contenente il nome del programma che si sta scaricando seguito dall'estensione .txt. Si noti che viene usata la funzione basename che dal link $file preleva solo il nome del file privo del path completo.
Una volta fatto ciò si controlla se il file di testo esiste. In caso esso esiste allora prelevo il dato scritto dentro e lo assegno alla variabile $counter altrimenti lo creo e la variabile la imposto pari a 0. Ora lo script non fa altro che incrementare $counter di 1 ($counter++ equivale ad $counter = $counter + 1) e la scrive sul file di testo sovrascrivendo ciò che c'è dentro. Si ha così il file contenente il numero di download del file aggiornato ogni volta che qualcuno clicca sul link di download.

Per utilizzare lo script basta scrivere nella nostra pagina web il link mediante la sintassi:


Ringrazio l'utente del forum di ubuntu-it che ha scritto questo script iniziale sul quale ho poi lavorato e che ho modificato.