Rev 758 | Rev 1179 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** Service recherche et ajout d'image a partir de divers critères* Encodage en entrée : utf8* Encodage en sortie : utf8** @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 $Id$*/class InventoryImage extends Cel {/*** Méthode appelée avec une requête de type GET.* Renvoie les infos sur l'image correspondant à l'id passé en parametre*/public function getElement($uid){// uid[0] : utilisateur obligatoire// uid[1] : identifiant image obligatoire// Controle detournement utilisateursession_start();$this->controleUtilisateur($uid[0]);$id_image_protegee = $this->proteger($uid[1]);$requete_selection_image = "SELECT * FROM cel_images WHERE ci_id_image = ".$id_image_protegee;$resultat_selection = $this->executerRequete($requete_selection_image);$image = false;if (count($resultat_selection) > 0) {$image = $resultat_selection[0];}$this->envoyer($image,'text/html','utf-8',true);}/*** Méthode appelée avec une requête de type POST avec un identifiant d'image.* Met a jour l'image correspondant à l'id passé en paramètre avec les valeurs passées dans le post*/public function updateElement($uid,$pairs){// Controle detournement utilisateur$this->controleUtilisateur($uid[0]);$requete_mise_a_jour_image = 'UPDATE cel_images SET ' ;$champs_a_mettre_a_jour = $this->construireRequeteMajMetaDonnees($pairs);$requete_mise_a_jour_image .= $champs_a_mettre_a_jour;$requete_mise_a_jour_image .= ' WHERE ci_id_image = '.$this->proteger($pairs['ci_id_image']) ;$resultat_mise_a_jour = $this->executerRequeteSimple($requete_mise_a_jour_image);$retour = false;if ($resultat_mise_a_jour) {$retour = 'OK';}$this->envoyer($retour);}/*** Assemble la requete de mise à jour des champs de metadonnées**/private function construireRequeteMajMetaDonnees($valeurs_metadonnees) {$requete_maj_champs = '';$champs_a_ignorer = array('ci_ce_observation','ci_id_image');foreach($valeurs_metadonnees as $champ => $valeur){if (!in_array($champ,$champs_a_ignorer)) {if ($champ == 'ci_meta_date') {$date_tab = split('/',$valeur) ;$date = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0] ;$requete_maj_champs .= $champ.' = "'.$date.'" , ' ;}else {$requete_maj_champs .= $champ.' = '.$this->proteger($valeur).' , ' ;}}}$requete_maj_champs = rtrim($requete_maj_champs," , ") ;return $requete_maj_champs;}/*** Méthode appelée avec une requête de type PUT.* Stocke une image, crée ses miniatures et enregistre ses informations* Renvoie l'identifiant d'image nouvellement crée en cas de succès*/function createElement($pairs){// Controle detournement utilisateursession_start();$this->controleUtilisateur($pairs['identifiant']);foreach ($_FILES as $file) {$infos_fichier = $file ;}if ($this->ajouterImageSurDdEtBdd($pairs, $infos_fichier)) {// l'upload demande de court-circuiter le fonctionnement normal de JREST// en quittant directement après l'envoi$this->envoyerMessageCreationEffectuee();exit;}}/*** Ajoute une image dans la base de données et stocke le fichier en fabriquant les miniatures,* renvoie le nouvel id d'image en cas de succès** @param array $pairs le tableau contenant l'identifiant de l'utilisateur* @param array $infos_fichier les infos sur le fichier à traiter, de la même forme que les* élements du tableau $_FILES de php*/public function ajouterImageSurDdEtBdd($pairs, $infos_fichier) {$identifiant_utilisateur = $pairs['identifiant'];$nouvel_ordre = $this->obtenirNouvelOrdrePourUtilisateur($identifiant_utilisateur);if (!$nouvel_ordre) {$message = 'Erreur lors du calcul du nouvel ordre de l\'image';trigger_error($message, E_USER_ERROR);}$extracteur_metadonnees = new ExtracteurMetadonnees();$informations_image = $extracteur_metadonnees->extraireMetadonnees($infos_fichier['tmp_name']) ;if(!$informations_image) {$message = 'Erreur lors de l\'extraction des metadonnées';trigger_error($message, E_USER_ERROR);}// ajout de quelques informations supplémentaire, en sus// des metadonnées dejà extraites$informations_image['ci_ordre'] = $nouvel_ordre ;$informations_image['ci_publiable_eflore'] = 'false' ;$informations_image['ci_nom_original'] = $infos_fichier['name'] ;// le md5 du fichier sert à repérer les images en doublons$informations_image['ci_md5'] = md5_file($infos_fichier['tmp_name']) ;$informations_image['ci_ce_utilisateur'] = $identifiant_utilisateur ;$requete_insertion_infos_image = $this->construireRequeteInsertionImage($informations_image);$resultat_insertion_infos_image = $this->executerRequeteSimple($requete_insertion_infos_image);if (!$resultat_insertion_infos_image) {$message = "Echec de l'insertion dans la base de donnees : " ;trigger_error($message, E_USER_ERROR);}$id_nouvelle_image = $this->obtenirIdImagePourIdentifiantEtOrdre($identifiant_utilisateur, $nouvel_ordre);if (!$id_nouvelle_image){$message = 'Impossible d\'obtenir le nouvel identifiant de l\'image' ;trigger_error($message, E_USER_ERROR);}$manipulateur_image = new ImageRecreation($this->config);$fichier_stocke = $manipulateur_image->stockerFichierEtCreerMiniatures($infos_fichier,$id_nouvelle_image);if (!$fichier_stocke) {$message = 'Erreur lors du stockage du fichier' ;trigger_error($message, E_USER_ERROR);}return $id_nouvelle_image;}private function obtenirNouvelOrdrePourUtilisateur($id_utilisateur) {$nouvel_ordre = 0 ;$requete_selection_ordre_max ='SELECT MAX(ci_ordre) as max_ordre FROM cel_images WHERE ci_ce_utilisateur = '.$this->proteger($id_utilisateur) ;$resultat_requete_ordre_max = $this->executerRequete($requete_selection_ordre_max);if($resultat_requete_ordre_max) {$nouvel_ordre = $resultat_requete_ordre_max[0]['max_ordre'];$nouvel_ordre++;}return $nouvel_ordre;}private function obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $ordre) {$id_image = false;$requete_id_image ='SELECT ci_id_image FROM cel_images WHERE ci_ce_utilisateur = '.$this->proteger($id_utilisateur).' AND ci_ordre = '.$ordre ;$resultat_id_image = $this->executerRequete($requete_id_image);if (count($resultat_id_image) > 0){$id_image = $resultat_id_image[0]['ci_id_image'];}return $id_image;}private function construireRequeteInsertionImage($informations_image) {$requete_insertion_image = "INSERT INTO cel_images ";$champs_a_inserer = '' ;$valeurs_a_inserer = '' ;foreach ($informations_image as $champ => $valeur){$champs_a_inserer .= $champ.',' ;if (is_null($valeur)){$valeurs_a_inserer .= 'NULL,' ;}else{$valeurs_a_inserer .= $this->proteger($valeur).',' ;}}if ($informations_image['ci_meta_date_time'] != 'NULL') {$champs_a_inserer .= 'ci_meta_date, ';$valeurs_a_inserer .= $this->proteger($informations_image['ci_meta_date_time']).',';}$champs_a_inserer .= 'ci_meta_date_ajout' ;$valeurs_a_inserer .= 'CURRENT_TIMESTAMP()' ;$requete_insertion_image .= "(".$champs_a_inserer.") VALUES (".$valeurs_a_inserer.")" ;return $requete_insertion_image;}private function envoyerMessageCreationEffectuee() {header('HTTP/1.0 200 Created');echo 'OK';exit() ;}/*** Méthode appelée avec une requête de type DELETE.* Supprime les infos sur l'image et le fichier correspondant à l'id passé en parametre*/function deleteElement($uid){// uid[0] : utilisateur obligatoire// uid[1] : identifiant image(s) obligatoire(s)// Controle detournement utilisateursession_start();$this->controleUtilisateur($uid[0]);if (!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) {return;}$ids_images = $uid[1];$requete_suppression_images = "DELETE FROM cel_images WHERE ci_id_image in (".$ids_images.")";$requete_suppression_lien_images_obs = "DELETE FROM cel_obs_images WHERE coi_ce_image in (".$ids_images.")";$resultat_suppression_image = $this->executerRequeteSimple($requete_suppression_images);$resultat_suppression_lien_images_obs = $this->executerRequeteSimple($requete_suppression_lien_images_obs);if (!$resultat_suppression_image) {$message = 'Erreur lors de la suppression de l\'image' ;trigger_error($message, E_USER_ERROR);}if (!$resultat_suppression_lien_images_obs) {$message = 'Erreur lors de la suppression des observations associées à l\'image' ;trigger_error($message, E_USER_ERROR);}$manipulateur_image = new ImageRecreation($this->config);$tableau_ids_image = split(',',$ids_images);foreach($tableau_ids_image as $id_image_a_detruire) {$destruction_fichier_image = $manipulateur_image->detruireImageSurDisque($id_image_a_detruire);}$this->envoyer('OK');}private function estUneSuiteIdentifiantsImage($chaine) {// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules// sans virgule terminale$reg_exp = "/^(([0-9])+,)*([0-9])+$/";return preg_match($reg_exp, $chaine);}}?>