* @license GPL v3 * @license CECILL v2 * @version $Id$ */ class InventoryImage extends Cel { const ARRET_SERVICE = false; /** * 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 utilisateur if(!isset($_SESSION)) {session_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) { if (self::ARRET_SERVICE) { header('Status: 503 Service Temporarily Unavailable'); echo "L'envoi d'images au cel est temporairement désactivé"; exit; } else { // Controle detournement utilisateur if (!isset($_SESSION)) { session_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){ if(self::ARRET_SERVICE) { header('Status: 503 Service Temporarily Unavailable'); echo "L'envoi d'images au cel est temporairement désactivé"; exit; } // uid[0] : utilisateur obligatoire // uid[1] : identifiant image(s) obligatoire(s) // Controle detournement utilisateur if(!isset($_SESSION)) {session_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); } } ?>