Tag Archive for 'file'

Rinominare un file in upload

Quella di rinominare un file in upload è una cosa che può essere molto utile fondamentalmente per 2 motivi:

  1. evitare di sovrascrivere file esistenti che hanno lo stesso nome
  2. evitare errori di upload dovuti a caratteri strani presenti nel nome del file

io uso un metodo molto semplice, in fase di upload, rilevo l'estensione del file con questa mia funzione, e le antepongo un nome univoco, utilizzando la funzione uniqid(pref).
Tale funzione oltre che restituire una stringa univoca permette si assegnare una sorta di prefisso, utile per identificare ad esempio i file di diverse sezioni di un sito (es. home_474ab038b3bbe.jpg)
Quindi, il solito form invierà il file da uplodare a upload.php

PHP:
  1. <form method="post" action="upload.php" enctype="multipart/form-data">
  2.     <input type="file" name="file_da_uplodare">
  3.     <input type="submit" value="Invia">
  4. </form>

... a seguire il file upload.php nel quale includo anche la funzione per rinominare il file, riceverà il file, lo rinominerà e lo uploderà.

PHP:
  1. <?php
  2.  
  3. function estensione($nome){
  4.     $trova_punto = explode(".", $nome);
  5.     $estensione = $trova_punto[count($trova_punto) - 1];
  6.     $estensione = strtolower($estensione);
  7.     if (isset($trova_punto[1]) == FALSE){
  8.         return "Nessuna estensione";
  9.     }
  10.     return $estensione;
  11. }
  12.  
  13. // directory dove va uplodato il file
  14. $directory = 'directoryupload/';
  15.  
  16. // verifica l'esistenza del file
  17. if (isset($_FILES['file_da_uplodare'])) {
  18.     $file_temporaneo= $_FILES['file_da_uplodare']['tmp_name'];
  19.     $nome_file = $_FILES['file_da_uplodare']['name'];
  20.  
  21.         // trova l'estensione del file
  22.         $estensione_file=estensione($nome_file);
  23.         // assegna un nome univooco al file
  24.         $nome_file=uniqid(file_).".".$estensione_file;
  25.  
  26.         //esegue l'upload e controlla che vada a buon fine
  27.     if (move_uploaded_file($file_temporaneo, $directory  . $nome_file)){
  28.         echo "Il file è stato caricato";
  29.     } else {
  30.         echo "Si è verificato un errore durante l'upload";
  31.     }
  32. }
  33. ?>

Contatore di accessi su un file txt

Prendendo spunto da una chiave di ricerca utilizzata per arrivate su phpinpillole.com, ti propongo un semplice contatore di accessi basato su un file di testo.
Le funzioni che è necessario conoscere, per le quali ti rimando direttamente a php.net, riguardano la manipolazione dei file e sono:

La sintassi del contatore è molto semplice:
apre il file, ne legge il contenuto (numero), aggiunge un +1 al numero esistente, restituisce il numero nuovo e lo scrive sul file.

PHP:
  1. $file_counter="count.txt";
  2. if(!($fp = fopen($file_counter, "r"))) die ("Non riesco ad aprire $file_counter");
  3. $counter =(int) fread($fp, 20);
  4. fclose($fp);
  5. $counter++;
  6. echo "Ciao, sei il visitatore numero $counter";
  7. $fp = fopen($file_counter, "w");
  8. fwrite($fp, $counter);
  9. fclose($fp);

Tenere traccia dei download con la mail

Con poche righe di script è possibile tenere traccia di chi decide di scaricare un file da un nostro sito. Interessante ad esempio nel caso in cui si dà la possibilità di scricare un progetto che richiederà aggiornamenti futuri. Ad esempio può essere utile chiedere la mail all'utente che decide di scaricare il file, con un form del genere...

HTML:
  1. <form name="DownloadForm"  method="post" action="download.php">
  2.   You Email<input name="email_utente" type="text"><br>
  3.   <input type="submit" name="Submit" value="Download">
  4.   <input name="file" type="hidden"  value="nomefile.zip">
  5. </form>

... che punta al file download.php (simile a questo) il quale si occuperà di far scaricare il file ed inviare la mail dell'avvenuto download.

PHP:
  1. <?php
  2. // recupero i dati e definisco le variabili
  3. $file=$_POST['file'];
  4. $email_utente=$_POST['email_utente'];
  5. $mia_email="mia@email.com";
  6. $oggetto="Download File";
  7. $corpo="Il File ".$file." è stato scaricato da ".$email_utente;
  8.  
  9. // mi invio la mail
  10. mail($mia_email, $oggetto, $corpo);
  11.  
  12. // faccio scaricare il file
  13. $percorso="/var/percorso/directory/download/";
  14. $percorso_file=$percorso.$file;
  15. $dimensione_file=filesize($percorso_file);
  16. header("Content-Type: application; name=".$file);
  17. header("Content-Transfer-Encoding: binary");
  18. header("Content-Length: ".$dimensione_file);
  19. header("Content-Disposition: inline; filename=".$file);
  20. header("Expires: 0");
  21. header("Cache-Control: no-cache, must-revalidate");
  22. header("Cache-Control: private");
  23. header("Pragma: public");
  24. readfile($percorso_file);
  25. ?>

Appunti: implementare eventuali controlli

Cancellare un file

La cosa importante da ricordare quando si vuole eliminare un file è che non bisogna fare riferimento al solo file ma a dove il file si trova all'interno del server. La funzione da utilizzare è
unlink(file)
Ecco come:

PHP:
  1. $percorsofile="/var/percorso/directory/file.txt";
  2. if (file_exists($percorsofile)) {
  3.     unlink($percorsofile);
  4. }

Appunti: Avere i giusti permessi di scrittura.

Upload di file

Eseguire upload di file con php non è molto complicato, almeno scrivento un codice di livello base.
Primo accorgimento ovviamente è assicurarsi di eseguire l'upload su una directory scrivibile (chmod 777 per i server linux).
Inoltre è importante ricordare di mettere sempre il parametro multipart/form-data nei form di invio.
Lo script che ti mostro di seguito come esempio, comprende sia il form di invio che il codice per effettuare l'upload, tutto su un unico file, upload.php.
Prima il form...

PHP:
  1. <form method="post" action="upload.php" enctype="multipart/form-data">
  2.     <input type="file" name="file_da_uplodare">
  3.     <input type="submit" value="Invia">
  4. </form>

e poi la parte di codice che tratterà il file da caricare...

PHP:
  1. <?php
  2. // definisce la directory dove va uplodato il file
  3. $directory = 'directoryupload/';
  4. // verifica l'esistenza del file
  5. if (isset($_FILES['file_da_uplodare'])) {
  6.     $file_temporaneo= $_FILES['file_da_uplodare']['tmp_name'];
  7.     $nome_file = $_FILES['file_da_uplodare']['name'];
  8.         //esegue l'upload e controlla che vada a buon fine
  9.     if (move_uploaded_file($file_temporaneo, $directory  . $nome_file)){
  10.         echo "Il file è stato caricato";
  11.     } else {
  12.         echo "Si è verificato un errore durante l'upload";
  13.     }
  14. }
  15. ?>

Utili modifiche che si possono fare a questo script potrebbero ad esempio riguardare l'implementazione di codice per:

  • controllare la dimensione del file che si vuole caricare;
  • rinominare il file in modo univoco in modo da evitare sovrascritture;
  • ecc...

Download di file senza svelarne il percorso

Può essere utile in alcuni casi permettere il download di files senza però mostrarne il percorso e quindi la directory dove sono contenuti.
Utile nei casi in cui si vuole impedire di sfogliare la directory non svelandola, appunto (anche se sarebbe sempre meglio impedirlo direttamente dall'httpd.conf o con un file .htaccess)
Oppure quando i file sono in una directory all'interno del server ma non raggiungibile via web.
Il link non deve quindi essere verso il file da scaricare ma verso una pagina php (es. download.php) alla quale passerai il nome del file come variabile, in questo modo:

HTML:
  1. <a href="download.php?file=nomefile.zip">Scarica</a>

il file download.php sarà invece strutturato così.

PHP:
  1. <?php
  2. $file=$_GET['file'];
  3. $percorso="/var/percorso/directory/download/";
  4. $percorso_file=$percorso.$file;
  5. $dimensione_file=filesize($percorso_file);
  6. header("Content-Type: application; name=".$file);
  7. header("Content-Transfer-Encoding: binary");
  8. header("Content-Length: ".$dimensione_file);
  9. header("Content-Disposition: inline; filename=".$file);
  10. header("Expires: 0");
  11. header("Cache-Control: no-cache, must-revalidate");
  12. header("Cache-Control: private");
  13. header("Pragma: public");
  14. readfile($percorso_file);
  15. ?>

Update: inoltre con poche altre righe di php, utilizzando questo sistema è possibile monitorare il download.

Leggere il contenuto di una directory

Con questo script è possibile leggere il contenuto di una directory.
Tramite un cliclo while viene mostrato il nome dell'oggetto trovato, se trattasi di file o directory e la dimensione

PHP:
  1. $Directory  = "."; // la directory di cui mostrare il contenuto
  2.  
  3. if(is_dir($Directory))
  4. {
  5.     $dir = opendir($Directory);
  6.     echo "<pre>";
  7.     while(false !== ($file = readdir($dir)))
  8.     {
  9.         $type = filetype($Directory ."/". $file);
  10.     // $size = filesize($file); corretto come sotto
  11.         $size = filesize($Directory ."/". $file);
  12.         echo "$file | $type | $size \n";
  13.     }
  14.     closedir($dir);
  15.     echo "</pre>";
  16. }
  17. else
  18. {
  19.     echo $Directory . " non è una directory";
  20. }