Lunedì, 04 Marzo 2019 22:17

Un uploader in PHP

Scritto da

Un'altra applicazione pratica del nostro amato PHP. Una piccola utility per caricare in upload sul nostro server dei file. L'esercizio prevede una pagina HTML con la form per il caricamento, un piccolo javascript fa un controllo semplice  e pratico che si stia inviando un file. Lo script PHP invocato controlla prima che l'estensione sia supportata e con poche istruzioni carica il file con un feedback esaustivo per l'utente. Va creata una cartella Upload nella cartella dei nostri file php ed html. Se siete su Linux, vanno assegnati i permessi corretti alla nostra directory di upload con un comando simile a chmod -R 777 /var/www/.../Upload sostituendo ovviamente il percorso corretto.

Trovate i file in allegato. Il progetto originale è ispirato dal prof. Mauro De Berardis.

Scegliamo di sviluppare il nostro applicativo con due file file: l'interfaccia con cui scegliere il file su pagina html, uno script php con il codice che effettua l'operazione fisica. Il lettore potrà modifica facilmente il codice per integrarlo su un solo file php.

upload.html

<!DOCTYPE html>
<html lang="it">
<head>
        <title>Uploader HTTP con Php</title>
        <meta charset="utf-8" >
        <link href=css/style.css rel="stylesheet" type="text/css">
</head>

<body>
<h1>File Upload</h1>
<form name="formupload" id="formupload" action="eseguiupload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="myfile" id="myfile" required>
        <br><br><br>
        <input type='submit' value='Upload'> <input type='reset' value='Cancella'>
</form>
</body>
</html>

La pagina html la lasciamo volontariamente semplice, col solo campo file obbligatorio. L'attributo "required" è stato introdotto con HTML5 e dovrebbe diventare uno standard di fatto per controllare la compilazione di un campo lato client, attività che precedentemente era affidata a JavaScript, ora decisamente più utile per altre operazioni.

 

Se volete abbellire la form con un foglio di stile esterno, potete inserire questo codice di esempio con il foglio style.css, personalizzarlo con fieldset, legend, abbellire i bottoni ecc

input
{
	background-color: #f0f0f0;
	width: 100px;
	border: 1px solid #888888"
} 

 

Il codice lato server è affidato ad un semplice script arricchito però da un controllo lato server non banale: l'estensione del file. E' un controllo necessario, potrà intuire il lettore, per evitare di eseguire file malevoli sul server che possano apportare danni. In questo esempio si eliminano i file .EXE anche se i nostri esercizi li testiamo perlopiù su ambienti Linux-like. Ci sono poi tutte le informazioni relative al file con le opportune variabili inizializzate nel blocco iniziale che vengono reperite con la variabile globale $_FILES, un array con la struttura seguente:

  • $_FILES["idform"]["name"]: nome del file caricato
  • $_FILES["idform"]["type"]: tipo di file caricato (in formato MIME type)
  • $_FILES["idform"]["size"]: dimensione del file caricato
  • $_FILES["idform"]["tmp_name"]: percorso e il nome del file temporaneo sul server
  • $_FILES["idform"]["error"]: un codice numerico compreso fra 0 e 8 indicante il tipo di errore eventuale, 0 in assenza di errore

eseguiupload.php

<?php

if (!isset($_FILES["myfile"]))
	exit();

$cartelladestinazione='Upload/'; // la cartella di destinazione dell'upload: CREALA

$nomefile=		$_FILES['myfile']['name']; //nome del file 
$tipofile=		$_FILES['myfile']['type']; // mime-type del file
$dimensionefile=$_FILES['myfile']['size']; //dimensione del file
$percorsotmp=	$_FILES['myfile']['tmp_name'];//percorso temporaneo  del file
$errore=		$_FILES['myfile']['error']; //valore da 0 - 8; 0  ok!

$estensioniconsentite=array("pdf","jpg","png","doc","docx"); //estensioni valide! 
$estensionefile= strtolower(end(explode('.', $nomefile)));

if (!in_array($estensionefile,$estensioniconsentite))
{
	echo "Estensione del file non consentita!";
	header( "refresh:5;url=upload.html" );
	echo "Stai per essere rediretto in 5 secondi. Se non accade, clicca qui"; 
	exit();
}

echo "Cartella di destinazione del file.. $cartelladestinazione <br>";
echo "Nome del file............................ $nomefile <br>";
echo "Tipo MIME del file................. $tipofile <br>";
echo "Dimensione del file.[Byte]......... $dimensionefile <br>";
echo "Percorso temporaneo del file....... $percorsotmp <br>";
echo "Errore(0-8)........................ $errore <br>";

if (move_uploaded_file($percorsotmp,$cartelladestinazione.$nomefile))
{	
	echo "Upload eseguito con successo ";
}
else {	echo "Si sono verificati dei problemi durante l'upload"; }
?>	

la funzione move_uploaded_file(file, destè standard ed inserita nella libreria principale PHP, quindi non occorre includere altro. Di per se stesso è molto semplice e prende solo due parametri, ma lo script è arricchito da tutte le varie informazioni. Al lettore il compito di potenziarlo con controlli ulteriori sulla chiamata valida dello script e la gestione dei casi di errore 1-7.

N.B. La riga $estensionefile= strtolower(end(explode('.', $nomefile))); potrebbe generare errore su alcune versioni apache/wamp per una configurazione di memoria limitata. Eventualmente potete splittare le istruzioni in più sottocomandi. Ad esempio:

$tmp = explode('.', $nomefile)
$estensionefile= strtolower(end($tmp));

 

Letto 293 volte
Prof. Alfredo Centinaro

Docente di "Scienze e tecnologie informatiche", "Tecnologie e progettazione di sistemi informatici", "Sistemi e Reti" presso IIS Alessandrini-Marino (Teramo), consulente e sviluppatore web. Ha collaborato per anni come sviluppatore presso MHT - Treviso, assistente Sistemi ed elaborazione dell'informazione in UniTE Corso di laurea in Scienze del turismo culturale, tutor presso Telecom Italia Learning Services (L'Aquila)

Joomla SEF URLs by Artio