[PHP]: Nuova Classe Uploader


Qualche tempo fa, avevo pubblicato un articolo ad una mia classe che permetteva di facilitare l’upload dei file, con pochi semplici comandi…

A distanza di tempo mi sono accorto di numerosi bug che corrompevano la corretta esecuzione dello script ( è stata la mia prima classe php 😛 )

Esattamente oggi, l’ho riscritta e testata modificando anche i comandi di esecuzione, in modo da facilitarne ancor di più l’esecuzione.


Requisiti:

  • PHP 5
  • Permessi in Scrittura sulla Cartella

Iniziamo scaricando il file sorgente della libreria:

class Uploader {

		private $ext_ok = array();
		private $ext_no = array();
		private $ctrl_ext = false;
		private $owrite = true;
		private $max_size = 0;
		private $path_file = '';
		private $campo = '';
		private $errore = '';

		public function Uploader($campo)
		{
			$this->campo = $campo;
		}

		public function getError()
		{
			return $this->errore;
		}

		public function set_opt($opzione, $valore)
		{
			if($opzione == 'controllo estensione')
			{
				$this->ctrl_ext = (bool)$valore;
			}
			elseif($opzione == 'estensioni consentite')
			{
				$this->ext_ok = explode(',', $valore);
			}
			elseif($opzione == 'estensioni non consentite')
			{
				$this->ext_no = explode(',', $valore);
			}
			elseif($opzione == 'massima dimensione')
			{
				$this->max_size = (int)$valore;
			}
			elseif($opzione == 'sovrascrittura')
			{
				$this->owrite = (bool)$valore;
			}
		}

		public function upload($destinazione)
		{
			$file = $_FILES[$this->campo]['name'];
			$size = $_FILES[$this->campo]['size'];
			$temp = $_FILES[$this->campo]['tmp_name'];

			if($this->max_size != 0 && ($size > $this->max_size))
			{
				$this->errore = ERR_TOO_BIG;
				return false;
			}
			else
			{
				$err = 0;

				if($this->ctrl_ext)
				{
						// non consentite
						if(count($this->ext_no) != 0)
						{
							foreach($this->ext_no as $no)
							{
								if(trim($no) == $this->getExt($file))
								{
									$err = 1;
								}
							}
						}

					if($err == 0)
					{
						$ctrl = 0;

						if(count($this->ext_ok) != 0)
						{
							foreach($this->ext_ok as $ok)
							{
								if(trim($ok) == $this->getExt($file))
								{
									$ctrl = 1;
								}
							}
						}
						else
						{
							$ctrl = 1;
						}

						if($ctrl == 0)
						{
							$err = 1;
						}
					}
				}

				if($err == 0)
				{
					if($this->owrite)
					{
						$this->path_file = $file;
					}
					else
					{
						if(file_exists($destinazione.$file))
						{
							$cas = md5(rand(0,9999999999));

							$nome = $this->dividi($file);

							$iniziali = substr($nome, 0, 3);

							$estensione = $this->getExt($file);

							$this->path_file = $iniziali.$cas.'.'.$estensione;
						}
						else
						{
							$this->path_file = $file;
						}
					}

					if(is_uploaded_file($temp))
					{
						if(move_uploaded_file($temp, $destinazione.$this->path_file))
						{
							return true;
						}
						else
						{
							$this->errore = ERR_UPLOAD;
							return false;
						}
					}
					else
					{
						$this->errore = ERR_UPLOAD;
						return false;
					}
				}
				else
				{
					$this->errore = ERR_WRONG_EXT;
					return false;
				}
			}
		}

		private function getExt($path)
		{
			$file_split = explode(".", $path);

			$estensione = array_pop($file_split);

			return $estensione;
		}

		private function dividi($nome)
		{
		   $file_split = explode(".", $nome);

			$estensione = array_pop($file_split);

			$len_ext = strlen($estensione);

			$nomef = substr($nome, 0, (strlen($nome) - ($len_ext + 1)));

			return $nomef;
		}

		public function getName()
		{
			return $this->path_file;
		}

	}

Ed ora veniamo all’utilizzo della classe stessa:

Definiamo il testo degli errori con la sintassi:

define(‘ERR_TOO_BIG’, ‘Il File è troppo Grande!’);
define(‘ERR_WRONG_EXT’, ‘Estensione non Consentita!’);
define(‘ERR_UPLOAD’, ‘Errore nell\’Upload del File’);

Ora includiamo la libreria con:

include(“libs/upload.inc.php”);

Istanziamo la classe con la variabile $up passando come riferimento della funzione il nome del campo di tipo file che ha inviato il dato:

$up = new Uploader(‘userfile’);

Ora veniamo alle opzioni, si usa la funzione set_opt(parametro, valore) come in questo esempio:

$up->set_opt(‘controllo estensione’, true); // impone di controllare l’estensione, quindi richiede l’opzione delle estensioni non consentite OPPURE quella delle opzioni consentite.

$up->set_opt(‘estensioni non consentite’, ‘txt, png’); // indica quali estesioni non sono consentite (separate con una virgola)

// $up->set_opt(‘estensioni consentite’, ‘jpg, bmp’); // indica quali estesioni  sono consentite (separate con una virgola)

$up->set_opt(‘sovrascrittura’, false); // indica che il file verrà rinominato invece di essere sovrascritto in caso esistesse gia

Dopo aver impostato lo script, lanciate il comando di upload e come parametro impostate il percorso dove andrà salvato il file:

if(!$up->upload(‘files/’))
{
die($up->getError());
}

La funzione ritorna un risultato booleano con il quale potrete richiamare la funzione getError() in caso di errore nell’upload, oppure getName() che ritorna il nome del file uppato in caso di riuscita.

Qui in allegato tutti i file pronti da scaricare: Classe Upload



6 Commenti

  1. simone ha detto:

    salve sono nuovo in questo forum io sto cercando di fare un sito web dove tutti gli utenti si potranno costruire il proprio sito web gratis, e inviare i file.html nel mio spazio hosting e trovo molto utile questo script ma mi chiedevo se fosse possibile una modifica, se quando si fa un upload si potrebbe impostare in automatico la rinonima del file ess: se un file in upload si chiama file.html se fosse possibile farlo diventare in automatico index.html

    Ringrazio anticipatamente a tutti

  2. StefanoV ha detto:

    Si hai ragione, l'ho lasciato x evitare di cambiare il nome del file …

    Cmq prova cosi: echo 'http://' . $_SERVER["SERVER_NAME"] . str_replace($pagina_attuale,'',$_SERVER["PHP_SELF"]) . $up->getName();

    Dove $pagina_attuale sarà il nome del file php in cui hai incluso la classe …

  3. Marco ha detto:

    Ti ringrazio, ma così avevo già provato e ritorna solamente il nome del file.

    Purtroppo l'"utonto" medio che userebbe questo script non è in grado di aggiungere la parte iniziale di URL per poi utilizzare il file caricato, di conseguenza sarebbe più comodo avere un ritorno dell'intera URL, come avveniva con il vecchio script. Credi sia possibile?

    Un'ultima cosa, e perdonami se ti stresso ma io sono proprio nuovo nel mondo php, secondo te non potrebbe essere comodo aggiungere una funzione che automaticamente rimuova gli spazi dai nomi dei files? Eliminerebbe ogni problema con le URL. So che è possibile farlo, ma purtroppo la mia inesperienza me lo impedisce 🙂 (se lo desideri ti offro volentieri una "birra virtuale" per il tempo che ti faccio perdere)..

    Grazie e scusa ancora per il disturbo…

  4. StefanoV ha detto:

    Ciao, si basta inserire l’else e usare il metodo “getName” cosi:

    if(!$up->upload(‘files/’))
    {
    die($up->getError());
    }
    else
    {
    echo $up->getName();
    }

  5. Marco ha detto:

    Ciao, ti ringrazio di avermi linkato il nuovo script, non avevo notato ce ne fosse uno più recente.
    Funziona molto bene, ma c’è solo un problemino: quando l’upload avviene con successo, non viene stampato alcun messaggio di upload riuscito con il link diretto al file, come invece avveniva con il tuo vecchio script. Dipende forse dalla stringa “else” che sembra incompleta nel file “esempio_new.php” presente nell’archivio?
    E’ possibile implementare questa funzione?

  6. lorenzo ha detto:

    Salve, sono l’admin del nuovo forum http://www.seoesperti.net.
    Vorrei invitarla sul forum a discutere delle nuove tecniche di indicizzazione e di Seo visto che lei è un vero esperto. Stiamo contattando tutti i migliori sul campo per creare un vero luogo di condivisione delle migliori menti del web.

    Mi scuso se ho scritto qui ma è stata una questione di tempo. 😉

    Scusi se ho disturbato.
    Ossequi.

Lascia un commento

%d blogger hanno fatto clic su Mi Piace per questo: