PHP – creare un semplice uploader via HTTP

Nonostante si trovino in giro potenti strumenti preconfezionati (CMS e simili), continua a vivere quello spirito (e gusto) -abbastanza nerd- di farsi le il logo di phpcose da soli.

Studiandoci su, copincollando e adattando script alle proprie esigenze, è infatti possibile prendersi piccole e grandi soddisfazioni.

Che siate già avvezzi o che vogliate avvicinarvi all'attitudine di cui sopra, quest'articolo vuole essere un piccolo giro panoramico dietro le quinte.

La scelta di oggi, ricade sulla realizzazione di un uploader (ovvero uno strumento per caricare files sul vostro sito web) che funziona tramite il vostro browser (quindi via HTTP) .

L'esempio seguente è realizzato in PHP e constiste fondamentalmente di di due files:

La prima pagina, in solo HTML, contiene un campo testo, un pulsante e un form per l'invio, la seconda, in PHP all'interno della quale troviamo lo script che elabora la richiesta e restituisce un output dal quale intendere l'esito dell'operazione (quest'ultimo passaggio è utile, anche se non indispensabile).

IL FORM HTML

Fondamentalmente quindi si tratta di realizzare una pagina che segua questo schema:

mostra lo schema »

[APERTURA FORM]

[CAMPO TESTO]

[PULSANTE]

[CHIUSURA FORM]

Quindi il codice sarà:

mostra codice »

<h3>gestione file</h3>

<h3>Upload</h3>

Upload files<br><form action="up.php" method="post" enctype="multipart/form-data">

<input type="file" name="upfile">

<input type="hidden" name="MAX_FILE_SIZE" value="10000">

<input type="submit" value="Invia il file">

</form>

Per poter funzionare con i files, il tag "form" deve contenere l'attributo "enctype" impostato  al valore "multipart/form-data", così come si vede nel codice.

Avrete sicuramente notato quell'ulteriore parametro che viene passato all'interno di un hidden field: si tratta della dimensione massima del file, dato che dipende dalla configurazione del file php.ini del vostro server e che quindi non può assumere valori maggiori di questo. E' utile per stabilire di volta in volta le dimensioni massime dei files a seconda del contesto, senza compromettere radicalmente il tutto (altrove potreste non avere bisogno di questo limite). Il dato è espresso in kBytes.

Eccoci al file che elabora il tutto.

file up.php

mostra codice PHP »

<? 

$allowed_types = array("image/gif","image/x-png","image/pjpeg","image/jpeg");if(!in_array($_FILES["upfile"]["type"],$allowed_types)) {

die("Il file-> $upfile <-non è di un tipo consentito, sono ammessi solo i seguenti: " . implode(",", $allowed_types) . ".");

}

// QUESTE RIGHE RENDONO LO SCRIPT COMPATIBILE CON LE VERSIONI

// DI PHP PRECEDENTI ALLA 4.1.0

if(!isset($_FILES)) $_FILES = $HTTP_POST_FILES;

if(!isset($_SERVER)) $_SERVER = $HTTP_SERVER_VARS;

/********************* VARIABILI DA SETTARE ********************/

// Directory dove salvare i files Uploadati ( chmod 777, percorso assoluto)

$upload_dir = $_SERVER["DOCUMENT_ROOT"] . "/upload";

// Eventuale nuovo nome da dare al file uploadato

$new_name = "";

// Se $new_name è vuota, il nome sarà lo stesso del file uploadato

$file_name = ($new_name) ? $new_name : $_FILES["upfile"]["name"];

if(trim($_FILES["upfile"]["name"]) == "") {

die("Non hai indicato il file da uploadare !");

}

#aggiungi la parte del controllo duplicato#

if(@is_uploaded_file($_FILES["upfile"]["tmp_name"])) {

@move_uploaded_file($_FILES["upfile"]["tmp_name"], "$upload_dir/$file_name")

or die("Impossibile spostare il file, controlla l'esistenza o i permessi della directory dove fare l'upload.");

} else {

die("Problemi nell'upload del file " . $_FILES["upfile"]["name"]);

}

echo "Upload del file " . $_FILES["upfile"]["name"] . " è avvenuto correttamente <br>";

print("nome file temporaneo: ".$_FILES['upfile']['tmp_name']."<br>");

print("nome file: ".$_FILES['upfile']['name']."<br>");

print("dimensione: ".$_FILES['upfile']['size']."<br>");

print("tipo file: ".$_FILES['upfile']['type']."<br>")

?>

La prima variabile che incontriamo ($allowed_types) dorà contenere i tipi di file consentiti (in questo caso solo gif, png e jpeg) e il relativo controllo su di essi che nell'eventualità termina lo script (comando die), stampando a video un messaggio di errore; per formattare correttamente questa variabile si dia un'occhiata a questa pagina.

La sezione che segue è quella in cui è memorizzato il percorso su cui fare l'upload, che deve essere esistente al momento dell'esecuzione ed avere i permessi impostati a "777" (lettura, scrttura ed esecuzione). Per effettuare queste operazioni è necessario servirsi di un client ftp (vi consiglio il comodo filezilla);

la variabile di sistema $_SERVER["DOCUMENT_ROOT"], serve per raggiungere la radice delle vostre cartelle remote. Nel nostro caso abbiamo scelto una cartella che sia immediatamente "figlia" della directory principale del sito.

E' prevista la possibilità di impostare il nome che il file debba avere durante e a fine esecuzione dello script; non compilando questi parametri, invece manterrà il nome originale.

Si va avanti e ci si ritrova davanti al fulcro dell'operazione, ovvero la funzione "move_uploaded_files", preceduta dal controllo "is_uploaded_file"( anteponendo un '@' è possibile nascondere l'output in caso d'errore), che hanno per argomento la posizione del file all'interno della variabile globale $_FILE[], che è un array associativo.

La sezione relativa alla compatibilità va presa per com'è e -cosa che si può facilmente intuire- è relativa all'abbandono e annessa sostituzione  di alcune variabili globali. In coda allo script, trovate una stampa dei parametri del file, grazie ai quali eventualmente è possibile fare un po' di debug.

N.B.

Lo script è stato alleggerito di proposito, e in questo stato, sovrascrive eventuali duplicati automaticamente...per il resto credo sia tutto a posto.

Non resta che copiare e incollare!

mostra lo schema »

 

[APERTURA FORM]

[CAMPO TESTO]

[PULSANTE]

[CHIUSURA FORM]

email

Autore: GinoCQ

Web designer freelance.

Condividi su
  • Ste Cape

    Ciao! sono Stefano! Problema: come faccio a visualizzare correttamente l’imput type=”file” su chrome? Grazie per la disponibilità!