1,46 → 1,61 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
|
/** |
* 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$ |
*/ |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author Aurelien Peronnet <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
|
/** |
* Service recherche et ajout d'image a partir de divers critères |
* in=utf8 |
* out=utf8 |
* |
*/ |
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 |
* Méthode appelée avec une requête de type GET. |
* Renvoie les infos sur l'image correspondant à l'id passé en parametre |
* @param int uid[0] : utilisateur obligatoire |
* @param int uid[1] : identifiant image obligatoire |
*/ |
public function getElement($uid) |
{ |
// uid[0] : utilisateur obligatoire |
// uid[1] : identifiant image obligatoire |
|
{ |
// Controle detournement utilisateur |
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); |
|
if(!isset($uid[0]) || !isset($uid[1])) { |
return; |
} |
|
$chercheur_image = new RechercheImage($this->config); |
|
$parametres = array('ordre' => $uid[1]); |
|
$retour = null; |
$image_recherchee = $chercheur_image->rechercherImages($uid[0], $parametres, 0, 1); |
if(count($image_recherchee) > 0) { |
$retour = $image_recherchee[0]; |
} |
$this->envoyer($retour,'application/json','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 |
* 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 |
* |
* @param int $uid[0] identifiant utilisateur |
* @param int $uid[1] ordre de l'image relatif à l'utilisateur |
* @param pairs array tableau contenant les valeurs de metadonnées à modifier |
*/ |
public function updateElement($uid,$pairs) |
{ |
47,17 → 62,14 |
// Controle detournement utilisateur |
$this->controleUtilisateur($uid[0]); |
|
$requete_mise_a_jour_image = 'UPDATE cel_images SET ' ; |
if(count($pairs) == 0 || !isset($uid[1])) { |
return; |
} |
|
$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); |
$gestionnaire_image = new GestionImage($this->config); |
$resultat_mise_a_jour = $gestionnaire_image->modifierImage($uid[0],$uid[1],$pairs); |
|
$retour = false; |
|
if ($resultat_mise_a_jour) { |
$retour = 'OK'; |
} |
66,55 → 78,26 |
} |
|
/** |
* Assemble la requete de mise à jour des champs de metadonnées |
* |
* 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 |
* |
* @param $pairs array tableau contenant les valeurs de metadonnées à ajouter |
*/ |
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 utilisateur |
session_start(); |
$this->controleUtilisateur($pairs['identifiant']); |
$this->controleUtilisateur($pairs['ce_utilisateur']); |
|
foreach ($_FILES as $file) { |
$infos_fichier = $file ; |
} |
|
if ($this->ajouterImageSurDdEtBdd($pairs, $infos_fichier)) { |
$gestionnaire_image = new GestionImage($this->config); |
$id_utilisateur = $pairs['ce_utilisateur']; |
|
if ($this->ajouterImage($id_utilisateur, $infos_fichier)) { |
|
// l'upload demande de court-circuiter le fonctionnement normal de JREST |
// en quittant directement après l'envoi |
121,136 → 104,8 |
$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'); |
259,14 → 114,16 |
} |
|
/** |
* 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 |
* Méthode appelée avec une requête de type DELETE. |
* Supprime les infos sur l'image et le fichier correspondant à l'ordre passé en parametre |
* Supporte la suppression multiple en passant plusieurs numéros séparés par des virgules |
* |
* @param int uid[0] id utilisateur |
* @param string uid[1] : ordre(s) image(s) obligatoire(s) séparés par des virgules |
* |
*/ |
function deleteElement($uid){ |
|
// uid[0] : utilisateur obligatoire |
// uid[1] : identifiant image(s) obligatoire(s) |
|
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
275,32 → 132,11 |
return; |
} |
|
$ids_images = $uid[1]; |
$ordres_images = explode(',',$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); |
} |
$gestionnaire_image = new GestionImage($this->config); |
$suppression_image = $gestionnaire_image->supprimerImage($uid[0], $ordres_images); |
|
$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'); |
} |
|
310,9 → 146,7 |
// sans virgule terminale |
$reg_exp = "/^(([0-9])+,)*([0-9])+$/"; |
|
return preg_match($reg_exp, $chaine); |
|
return preg_match($reg_exp, $chaine); |
} |
|
} |
?> |