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
}