// // This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. // // To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/1.0/ // // or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. // // Francais (brouillon): http://creativecommons.org/projects/international/fr/translated-license // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Gestion des images // v0.1.0 class images { var $chemin = "../datas/"; var $maxThumbWidth = 100; var $maxThumbHeight = 100; // Formats de fichiers autorisés, les autres sont forcéments mauvais :) var $formats = '\.(png|jpg|jpeg|jpe)$'; var $err = array( "stop" => "oui", "log" => "oui", "debug" => "oui"); // Gestion des erreurs function _err($err,$debug="") { // Si le debug est activé if($this->err[debug] == "oui" && !empty($debug)) $err.= "\n// DEBUG //\n".$debug; // Si on log les erreurs if($this->err[log] == "oui") $this->erreurs[] = $err; // Si on s'arrête sur les erreurs if($this->err[stop] == "oui") { echo "
".htmlentities(stripslashes($err))."
"; exit; } $this->erreur = $err; return FALSE; } function liste($journal) { if(!file_exists($this->chemin."documents/".$journal."/images")) $this->createDir($journal,"images"); if(!file_exists($this->chemin."documents/".$journal."/images/.thumbs")) $this->createDir($journal,"images/.thumbs"); $handle = @opendir($this->chemin."documents/".$journal."/images/"); $dir = "/images/"; while($file = readdir($handle)) { if(substr($file,0,1) != ".") { $path = $this->chemin."documents/".$journal.$dir.$file; $size = filesize($path); $date = filemtime($path); $out[] = array("file"=>$file,"size"=>$size,"date"=>$date); } } closedir($handle); return $out; } function createDir($journal,$dir) { if(!@mkdir($this->chemin."documents/".$journal."/".$dir,0777)) return FALSE; return TRUE; } function verify($journal,$file) { if(!eregi("^([a-z0-9_ -]{1,30}/)?[a-z0-9_. -]+$",$file)) return $this->_err("Caractères non autorisés dans le nom du fichier!"); if(!file_exists($this->chemin."documents/".$journal."/images/".$file)) return $this->_err("Fichier inexistant."); return TRUE; } function supprimer($journal,$file) { if(is_array($file)) { foreach($file as $el) { if(!$this->verify($journal,$el)) return FALSE; if(!@unlink($this->chemin."documents/".$journal."/images/".$el)) return $this->_err("Impossible de supprimer le fichier {$el}."); @unlink($this->chemin."documents/".$journal."/images/.thumbs/".$el); } } else { if(!$this->verify($journal,$file)) return FALSE; if(!@unlink($this->chemin."documents/".$journal."/images/".$file)) return $this->_err("Impossible de supprimer le fichier {$file}."); @unlink($this->chemin."documents/".$journal."/images/.thumbs/".$file); } return TRUE; } function _dirsize($path , $recursive=TRUE) { $result = 0; if(!is_dir($path) || !is_readable($path)) return 0; else { $fd = dir($path); while($file = $fd->read()) { if(($file != ".") && ($file != "..")) { if(@is_dir("$path/$file/")) $result += $recursive? $this->_dirsize("$path/$file/"):0; else $result += filesize("$path/$file"); } } } $fd->close(); return $result; } function get_quota($journal) { $taille = $this->_dirsize($this->chemin."documents/".$journal."/"); $taille = round($taille / 1000 / 1000,2); return $taille; } function upload($journal,$file,$max="") { $dir = "images/"; if($file['error'] != UPLOAD_ERR_OK) { $err = $file['error']; if($err == UPLOAD_ERR_INI_SIZE) return $this->_err("Erreur d'envoi: fichier trop gros pour le serveur."); elseif($err == UPLOAD_ERR_FORM_SIZE) return $this->_err("Erreur d'envoi: fichier trop gros, plus de 250Ko."); elseif($err == UPLOAD_ERR_PARTIAL) return $this->_err("Erreur d'envoi: Le fichier n'a pas été téléchargé en entier."); elseif($err == UPLOAD_ERR_NO_FILE) return $this->_err("Erreur d'envoi: Aucun fichier téléchargé."); else return $this->_err("Erreur d'envoi: Erreur inconnue.",$file['error']); } if(!eregi($this->formats,$file['name'])) return $this->_err("Vous ne pouvez importer que des images au format libre.",$this->formats); #elseif(eregi("(application|php)",$file['type'])) # return $this->_err("Vous n'avez pas le droit d'uploader des fichiers scripts ou exécutables.",$file['type']); elseif($file['size'] > 250000) return $this->_err("Votre fichier fait plus de 250Ko. Vous ne pouvez pas uploader des fichiers supérieurs à 200Ko."); $quota = $this->get_quota($journal); if(!empty($max) && (($quota + round($file['size'] / 1000 / 1000)) > $max)) return $this->_err("Vous ne pouvez pas ajouter de fichier, vous n'avez plus assez d'espace libre."); if(!empty($dir)) $dir = $dir.'/'; if(file_exists($this->chemin."documents/{$journal}/".$dir.$file['name'])) return $this->_err("Ce fichier existe déjà."); if(!@move_uploaded_file($file['tmp_name'], $this->chemin.'documents/'.$journal.'/'.$dir.$file['name'])) return $this->_err("Erreur de chargement inconnue."); $this->resize($journal,$file['name']); return TRUE; } function getNewSize($width,$height,$maxWidth,$maxHeight) { if($width > $maxWidth OR $height > $maxHeight) { if($height <= $width) $ratio = $maxWidth / $width; else $ratio = $maxHeight / $height; $newWidth = round($width * $ratio); $newHeight = round($height * $ratio); } else { $newWidth = $width; $newHeight = $height; } return array($newWidth,$newHeight,'','width="'.$newWidth.'" height="'.$newHeight.'"'); } function resize($journal,$file) { $this->sourceDir = $this->chemin."documents/".$journal."/images/"; if(!function_exists("imagetypes")) die("GD2 non installé?!"); $size = @getimagesize($this->sourceDir.$file); if($size[2] == 1) { if(imagetypes() & IMG_GIF) $sourceImage = @imagecreatefromgif($this->sourceDir.$file); else return FALSE; } elseif($size[2] == 2) { if(imagetypes() & IMG_JPG) $sourceImage = @imagecreatefromjpeg($this->sourceDir.$file); else return FALSE; } elseif($size[2] == 3) { if(imagetypes() & IMG_PNG) $sourceImage = @imagecreatefrompng($this->sourceDir.$file); else return FALSE; } if(!$sourceImage) return FALSE; $newSize = $this->getNewSize($size[0],$size[1],$this->maxThumbWidth,$this->maxThumbHeight); $width = $newSize[0]; $height = $newSize[1]; $newImage = imagecreatetruecolor($width,$height); imagecopyresampled($newImage,$sourceImage,0,0,0,0,$width,$height,$size[0],$size[1]); if(!imagejpeg($newImage,$this->sourceDir.".thumbs/".$file)) return FALSE; return TRUE; } } ?>