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.

Didattica Gambas: Aprire file e siti coi programmi di default


Ogni sistema ha dei programmi impostati detti Preferiti. Essi sono quei programmi installati sul proprio sistema che vengono utilizzati da altre applicazioni per svolgere determinati lavori. Ad esempio quando avete un link ad un sito internet inviatovi da un amico tramite email, basterà cliccare su di esso per vedere aprirsi il browser impostato di default come preferito. Questo processo è molto utile poichè permette ai programmi scritti di effettuare operazioni per le quali andrebbe costruito un modulo apposito. Come si può sfruttare ciò allora per ampliare le operazioni effettuabili dai nostri software scritti in Gambas?

Beh la risposta è semplice e ci si può arrivare mediante diverse strade.

La prima cosa a cui si potrebbe pensare sarebbe quella di interrogare il terminale mediante un apposito comando e chiedere quali sono i software di default, prelevare quello che ci serve e lanciarlo con tutti i parametri utili.
Tale scelta, ovviamente, è fattibile ma mancherebbe di quella semplicità che si cerca di dare ai programmi. Eseguire questo metodo, inoltre, aumenta la complessità computazionale del nostro codice poichè bisogna passare il comando al terminale, aspettare lo svolgersi del comando, leggere la risposta, estrarre le informazioni utili e usarle per i nostri scopi.
Ovviamente la complessità è irrilevante se il codice viene letto così ma la sua realizzazione richiedo uno studio attento dell’output e sicuramente questo non giova alla semplicità di programmazione.

Ecco allora che viene in aiuto una pratica funzione della classe Desktop. Essa infatti tra le sue funzioni implementa quella che fa al caso nostro: Open.

Open è una funzione davvero potente e duttile. Essa ci permettre di aprire file, siti e url ftp. Basta infatti seguire la sintassi del suo prototipo per usarla:


Desktop.Open(URL as string)

dove URL è un link http, https, ftp o file. Basterà usare questa semplice riga per abbattere notevolmente la complessità computazionale del nostro codice.
Potrete aprire così i vostri link ricorrendo al browser di default senza dover usare codice agiuntivo.

Utile vero?

Didattica Gambas: Passaggio parametri da riga di comando


Un paio di post fa ho spiegato molto sinteticamente come creare applicazioni in C che permettessero il passaggio al programma di argomenti da riga di comando.

Ora vedremo come eseguire la stessa procedura ma con codice scritto in Gambas. Anche se la potenza di questo linguaggio si basa sulla facilità con cui si possono scrivere software con interfaccia grafica, alle volte può essere molto più utile scrivere codici di programmi per terminale.

Proprio come accade per il linguaggio C, anche con il gambero è possibile passare argomenti che verranno poi salvati in un vettore di tipo stringa dove ogni elemento corrisponde ad un parametro.

Avviamo un nuovo progetto e selezioniamo “Applicazione a riga di comando”. Fatto ciò si presenterà il solito IDE ma con la mancanza dei tipici oggetti grafici.
Si nota subito la mancanza del form FMain sostituito dal modulo MMain.

Spostiamoci nell’editor del codice e scriviamo:

PRINT "Nome programma: " & Application.Args[0]
PRINT "Argomenti passati: " & Application.Args.Count
PRINT "Primo argomento: " & Application.Args[1]
PRINT "Secondo argomento: " & Application.Args[2]

Analizziamo gli elementi fondamentali del codice. L’uso di Application.Args[x] permette di controllare il contenuto dell’array degli argomenti passati. Bisogna tenere presente che il primo elemento del vettore Application.Args[0] contiene sempre il nome del programma stesso. Proseguendo così si trovano il primo argomento passato (Application.Args[1]), il secondo (Application.Args[2]), ecc…..

Di notevole importanza è anche l’elemento Application.Args.Count che altri non è che una variabile di tipo integer contenete il numero degli elementi passati al programma. Specifico che se al programma vengono passati 3 elementi Application.Args.Count varrà 4 poichè in esso è conteggiato anche il nome del programma stesso.
Esso inoltre è importanti per scrivere programmi dei quali non si conosce preventivamente il numero di argomenti passati. Grazia a Application.Args.Count, infatti, è possibile gestire un ciclo che legga tutti i dati anche senza conoscerne il numero preventivamente.

Compilando e lanciando il codice precedente e scrivendo nel terminale ad esempio:

./mio_programma uno due  

Ci verrà restituito:

Nome programma: mio_programma
Argomenti passati 3
Primo argomento: uno
Secondo argomento: due


Le potenzialità di questo codice sono molte ed è possibile creare programmi molto versatili usabili comodamente da terminale.

Inoltre voglio precisare che questo tipo di gestione può essere utilizzata anche con programmi ad interfaccia grafica. Infatti è possibile lanciare questi programmi da terminale passando eventuali argomenti magari per settare delle impostazioni iniziali.