Rev 126 | Rev 140 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Classe implémentant l'API d'eFlore Images pour le projet CEL.** @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=EfloreApi01Images** @package eFlore/services* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @author Aurélien PERONNET <aurelien@tela-botanica.org>* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>* @version 1.0* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)*/// TODO : Config et Outils sont des classes statiques qui doivent poser des pb pour les tests...class Images {private $parametres = array();private $ressources = array();private $Bdd;private $formats_supportes = array('image/jpeg');private $ref_tax_demande = array();public function __construct(Bdd $bdd) {$this->Bdd = $bdd;}public function consulter($ressources, $parametres) {$this->parametres = $parametres;$this->ressources = $ressources;$this->definirValeurParDefautDesParametres();$this->verifierParametres();$this->analyserMasqueNn();$id_image_a_renvoyer = $this->obtenirIdImageAuHasardPourNumNom();$image = $this->recupererImageBinaire($id_image_a_renvoyer);$resultat = new ResultatService();$resultat->mime = 'image/jpeg';$resultat->corps = $image;return $resultat;}private function definirValeurParDefautDesParametres() {if (isset($this->parametres['retour']) == false) {$this->parametres['retour'] = 'image/jpeg';}if (isset($this->parametres['retour.format']) == false) {$this->parametres['retour.format'] = 'M';}}private function verifierParametres() {$erreurs = array();if (isset($this->parametres['masque.nn']) == false) {$erreurs[] = "Le paramètre masque.nn est obligatoire.";} else {if ($this->verifierMasqueNnAutoriseActuellement() == false) {$erreurs[] = "Le paramètre masque.nn peut contenir une seule valeur numérique pour l'instant.";} else if ($this->verifierValeurParametreMasqueNn() == false) {$erreurs[] = "Le paramètre masque.nn est mal formé.";}}if (isset($this->parametres['retour']) == false) {$erreurs[] = "Le paramètre type de retour 'retour' est obligatoire.";}if ($this->verifierValeurParametreRetour() == false) {$erreurs[] = "Le type de retour '{$this->parametres['retour']}' n'est pas supporté";}if (isset($this->parametres['retour.format']) == false) {$erreurs[] = "Le paramètre de format de retour 'retour.format' est obligatoire.";}if ($this->verifierValeurParametreFormat() == false) {$erreurs[] = "Le type de format '{$this->parametres['retour.format']}' n'est pas supporté";}if (count($erreurs) > 0) {$message = implode('<br />', $erreurs);$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;throw new Exception($message, $code);}}private function verifierValeurParametreRetour() {return in_array($this->parametres['retour'], $this->formats_supportes);}private function verifierValeurParametreFormat() {$formats = Outils::recupererTableauConfig('Images.formats');$ok = array_key_exists($this->parametres['retour.format'], $formats);return $ok;}private function verifierMasqueNnAutoriseActuellement() {$ok = is_numeric($this->parametres['masque.nn']) ? true : false;return $ok;}private function verifierValeurParametreMasqueNn() {$nn = $this->parametres['masque.nn'];$projetPattern = '(?:(?:[A-Z0-9]+:)?(?:[0-9]+,)*[0-9]+)';$patternComplet = "/$projetPattern(?:;$projetPattern)*/i";$ok = preg_match($patternComplet, $nn) ? true : false;return $ok;}private function analyserMasqueNn() {$nn = $this->parametres['masque.nn'];if (is_numeric($nn)) {$this->ref_tax_demande['bdtfx'] = $nn;} else {// ceci contient potentiellement des formes ref_tax1:nn1,nn2;ref_tax2:nn3,nn4$projetsListeEtNumNoms = explode(';', $nn);if (count($projetsListeEtNumNoms) > 0) {foreach ($projetsListeEtNumNoms as $projetEtNumNoms) {list($projet, $numNoms) = explode(':', $projetEtNumNoms);$this->ref_tax_demande[$projet] = explode(',', $numNoms);}}}}private function obtenirIdImageAuHasardPourNumNom() {$numNom = $this->Bdd->proteger($this->ref_tax_demande['bdtfx']);//TODO: modifier la requete lors du passage à la nouvelle base de données pour faire quelque chose// du numéro nomenclatural + modifier les champs appelés pour le nouveau format$requete = 'SELECT coi.coi_ce_image AS id_image '.'FROM cel_obs_images AS coi '.' LEFT JOIN cel_inventory AS ci '.'ON (coi.coi_ce_observation = ci.ordre AND coi.coi_ce_utilisateur = ci.identifiant) '.'WHERE ci.transmission = 1 '." AND ci.num_nom_ret IN ($numNom) ";$resultat = $this->Bdd->recupererTous($requete);if (!is_array($resultat) || count($resultat) <= 0) {$message = "Aucune image ne correspond au numéro numenclatural $refTax:$numNom";$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;throw new Exception($message, $code);}$id_image_hasard = $resultat[array_rand($resultat)]['id_image'];return $id_image_hasard;}private function recupererImageBinaire($id_image) {$image = '';$chemin = $this->obtenirCheminImage($id_image);$image = file_get_contents($chemin);if ($image === false) {$message = "L'image demandée est introuvable sur le serveur : $chemin";$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;throw new Exception($message, $code);}return $image;}private function obtenirCheminImage($idImage) {$nom = $this->convertirIdImageVersNomFichier($idImage);$dossier = $this->convertirIdImageVersChemin($idImage);return $dossier.'/'.$nom;}private function convertirIdImageVersNomFichier($idImage) {$codeImage = $this->construireCodeImage($idImage);$nom_fichier = $codeImage.'.jpg';return $nom_fichier;}private function convertirIdImageVersChemin($idImage) {$codeImage = $this->construireCodeImage($idImage);list($dossierNiveau1, $dossierNiveau2, $idFichier, $format) = explode('_', $codeImage);$chemin_base = Config::get('Images.chemin');$chemin_sur_serveur = $chemin_base.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/'.$format;return $chemin_sur_serveur;}private function construireCodeImage($idImage) {$codeImage = sprintf('%09s', $idImage);$codeImage = wordwrap($codeImage, 3, '_', true);$format = $this->parametres['retour.format'];$codeImage .= '_'.$format;return $codeImage;}}?>