PHP: creare una classe per gestire gli upload

PHP: creare una classe per gestire gli upload

Possiamo semplificare l'upload dei file con una classe PHP.

L'implementazione è la seguente:


class My_Upload_Wrapper {

	// Path assoluto alla document root del sito
	
	const ABSPATH = $_SERVER['DOCUMENT_ROOT'];

	
	public $fileName; // Riferimento al file
	protected $_uploadPath; // Path assoluto alla directory di upload
	public $allowedMimeTypes = array(); // Tipi MIME consentiti
	public $size; // Dimensione massima dei file in byte

	public function __construct( $file, $path, $mimes, $size ) {

		
        $this->fileName = $_FILES[$file]; // $file è il valore dell'attributo name dell'input di tipo file
        $this->_uploadPath = self::ABSPATH . '/' . $path . '/';
        $this->allowedMimeTypes = $mimes;
        $this->size = $size;
	}
	
	// Verifica errori predefiniti

	protected function _hasErrors() {
		$error = false;

		switch ( $this->fileName['error'] ) {
        	case UPLOAD_ERR_OK:
            	break;
        	case UPLOAD_ERR_NO_FILE:
            	$error = true;
            	break;
        	case UPLOAD_ERR_INI_SIZE:
        	case UPLOAD_ERR_FORM_SIZE:
            	$error = true;
            	break;
        	default:
            	break;
    	}

    	return $error;
	}
	
	// Verifica della dimensione

	protected function _hasWrongSize() {
		$error = false;
		if( $this->fileName['size'] > $this->size ) {
			$error = true;
		}
		return $error;
	}
	
	// Verifica del tipo MIME

	protected function _hasWrongMime() {
		$error = false;
		$finfo = new finfo( FILEINFO_MIME_TYPE );
		if ( false === $ext = array_search(
        	$finfo->file( $this->fileName['tmp_name'] ),
        	$this->allowedMimeTypes,
        	true )) {
				$error = true;
		}

		return $error;
	}
	
	// Crea il nome del file caricato
	// Per nomi random è sufficiente cambiare la variabile $newName in ad es:
	// $newName = 'file-' . time();

	protected function _createName( $str ) {
		$parts = pathinfo( $str );
		$ext = '.' . $parts['extension'];
		$newName = preg_replace( '/[^a-z0-9]/i', '', $parts['filename'] );
		return $newName . $ext;
	}
	
	// Restituisce un array di messaggi di errore o true se l'upload ha avuto successo

	public function upload() {
		$errors = array();
		$output = true;

		if( $this->_hasErrors() ) {
			$errors[] = 'Errore nel file';
		}

		if( $this->_hasWrongSize() ) {
			$errors[] = 'File troppo grande';	
		}

		if( $this->_hasWrongMime() ) {
			$errors[] = 'Formato del file non valido';
		}

		if( count( $errors ) > 0 ) {
			return $errors;
		} else {
			$name = $this->_createName( $this->fileName['name'] );

			if( move_uploaded_file( $this->fileName['tmp_name'], $this->_uploadPath . $name ) ) {
				return $output;
			} else {
				$errors[] = 'Errore. Riprova';
				return $errors;
			}
		}
	}
}

Esempio d'uso:


require_once( 'My_Upload_Wrapper.php' );

$uploader = new My_Upload_Wrapper( 'my-image', 'uploads/images', 
				array(
            		'jpg' => 'image/jpeg',
					'jpeg' => 'image/jpeg',
					'png' => 'image/png'
				), 
				100000
		    );
		    
$upload = $uploader->upload();

if( !is_array( $upload ) ) {
	// Upload avvenuto con successo
}

Torna su