Subversion Repositories eFlore/Applications.cel

Rev

Rev 1179 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
416 aurelien 1
<?php
2
/**
620 aurelien 3
 * Service recherche  et ajout d'image a partir de divers critères
4
 * Encodage en entrée : utf8
5
 * Encodage en sortie : utf8
416 aurelien 6
 *
620 aurelien 7
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
8
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
9
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
10
 * @version $Id$
416 aurelien 11
 */
758 aurelien 12
class InventoryImage extends Cel {
1182 jpm 13
 
1179 aurelien 14
	const ARRET_SERVICE = false;
1182 jpm 15
 
620 aurelien 16
	/**
17
	 * Méthode appelée avec une requête de type GET.
18
	 * Renvoie les infos sur l'image correspondant à l'id passé en parametre
19
	*/
20
	public function getElement($uid)
1182 jpm 21
	{
620 aurelien 22
		// uid[0] : utilisateur obligatoire
23
		// uid[1] : identifiant image obligatoire
416 aurelien 24
 
25
		// Controle detournement utilisateur
1078 aurelien 26
		if(!isset($_SESSION)) {session_start();}
620 aurelien 27
	   	$this->controleUtilisateur($uid[0]);
416 aurelien 28
 
1182 jpm 29
		$id_image_protegee = $this->proteger($uid[1]);
620 aurelien 30
		$requete_selection_image = "SELECT * FROM cel_images WHERE ci_id_image = ".$id_image_protegee;
416 aurelien 31
 
620 aurelien 32
		$resultat_selection = $this->executerRequete($requete_selection_image);
1182 jpm 33
 
620 aurelien 34
		$image = false;
1182 jpm 35
 
663 aurelien 36
		if (count($resultat_selection) > 0) {
620 aurelien 37
			$image = $resultat_selection[0];
416 aurelien 38
		}
39
 
620 aurelien 40
		$this->envoyer($image,'text/html','utf-8',true);
416 aurelien 41
	}
42
 
620 aurelien 43
	/**
44
	 * Méthode appelée avec une requête de type POST avec un identifiant d'image.
45
	 * Met a jour l'image correspondant à l'id passé en paramètre avec les valeurs passées dans le post
46
	*/
47
	public function updateElement($uid,$pairs)
416 aurelien 48
	{
49
		// Controle detournement utilisateur
50
		$this->controleUtilisateur($uid[0]);
1182 jpm 51
 
620 aurelien 52
		$requete_mise_a_jour_image = 'UPDATE cel_images SET ' ;
1182 jpm 53
 
620 aurelien 54
		$champs_a_mettre_a_jour = $this->construireRequeteMajMetaDonnees($pairs);
55
		$requete_mise_a_jour_image .= $champs_a_mettre_a_jour;
416 aurelien 56
 
620 aurelien 57
		$requete_mise_a_jour_image .= ' WHERE ci_id_image = '.$this->proteger($pairs['ci_id_image']) ;
416 aurelien 58
 
663 aurelien 59
		$resultat_mise_a_jour = $this->executerRequeteSimple($requete_mise_a_jour_image);
1182 jpm 60
 
620 aurelien 61
		$retour = false;
1182 jpm 62
 
663 aurelien 63
		if ($resultat_mise_a_jour) {
620 aurelien 64
			$retour = 'OK';
65
		}
1182 jpm 66
 
620 aurelien 67
		$this->envoyer($retour);
68
	}
1182 jpm 69
 
620 aurelien 70
	/**
71
	 * Assemble la requete de mise à jour des champs de metadonnées
1182 jpm 72
	 *
620 aurelien 73
	*/
74
	private function construireRequeteMajMetaDonnees($valeurs_metadonnees) {
1182 jpm 75
 
620 aurelien 76
		$requete_maj_champs = '';
1182 jpm 77
 
663 aurelien 78
		$champs_a_ignorer = array('ci_ce_observation','ci_id_image');
1182 jpm 79
 
620 aurelien 80
		foreach($valeurs_metadonnees as $champ  => $valeur)
416 aurelien 81
		{
1182 jpm 82
 
632 aurelien 83
			if (!in_array($champ,$champs_a_ignorer)) {
84
				if ($champ == 'ci_meta_date') {
1182 jpm 85
 
620 aurelien 86
					$date_tab = split('/',$valeur) ;
87
					$date = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0] ;
1182 jpm 88
 
620 aurelien 89
					$requete_maj_champs .= $champ.' = "'.$date.'" , ' ;
1182 jpm 90
 
620 aurelien 91
				}
92
				else {
93
					$requete_maj_champs .= $champ.' = '.$this->proteger($valeur).' , ' ;
94
				}
416 aurelien 95
			}
96
		}
97
 
663 aurelien 98
		$requete_maj_champs = rtrim($requete_maj_champs," , ") ;
1182 jpm 99
 
620 aurelien 100
		return $requete_maj_champs;
416 aurelien 101
	}
102
 
103
 
620 aurelien 104
	/**
105
	 * Méthode appelée avec une requête de type PUT.
106
	 * Stocke une image, crée ses miniatures et enregistre ses informations
107
	 * Renvoie l'identifiant d'image nouvellement crée en cas de succès
108
	*/
1182 jpm 109
	function createElement($pairs) {
110
		if (self::ARRET_SERVICE) {
1179 aurelien 111
			header('Status: 503 Service Temporarily Unavailable');
112
			echo "L'envoi d'images au cel est temporairement désactivé";
113
			exit;
1182 jpm 114
		} else {
115
			// Controle detournement utilisateur
116
			if (!isset($_SESSION)) {
117
				session_start();
118
			}
119
			$this->controleUtilisateur($pairs['identifiant']);
120
 
121
			foreach ($_FILES as $file) {
122
				$infos_fichier = $file ;
123
			}
124
 
125
			if ($this->ajouterImageSurDdEtBdd($pairs, $infos_fichier)) {
126
				// l'upload demande de court-circuiter le fonctionnement normal de JREST
127
				// en quittant directement après l'envoi
128
				$this->envoyerMessageCreationEffectuee();
129
				exit;
130
			}
1179 aurelien 131
		}
1182 jpm 132
	}
416 aurelien 133
 
620 aurelien 134
	/**
632 aurelien 135
	 * Ajoute une image dans la base de données et stocke le fichier en fabriquant les miniatures,
620 aurelien 136
	 * renvoie le nouvel id d'image en cas de succès
1182 jpm 137
	 *
620 aurelien 138
	 * @param array $pairs le tableau contenant l'identifiant de l'utilisateur
139
	 * @param array $infos_fichier les infos sur le fichier à traiter, de la même forme que les
140
	 * élements du tableau $_FILES de php
141
	*/
142
	public function ajouterImageSurDdEtBdd($pairs, $infos_fichier) {
1182 jpm 143
 
632 aurelien 144
		$identifiant_utilisateur = $pairs['identifiant'];
145
		$nouvel_ordre = $this->obtenirNouvelOrdrePourUtilisateur($identifiant_utilisateur);
1182 jpm 146
 
632 aurelien 147
		if (!$nouvel_ordre) {
620 aurelien 148
			$message = 'Erreur lors du calcul du nouvel ordre de l\'image';
149
			trigger_error($message, E_USER_ERROR);
150
		}
1182 jpm 151
 
620 aurelien 152
		$extracteur_metadonnees = new ExtracteurMetadonnees();
153
		$informations_image = $extracteur_metadonnees->extraireMetadonnees($infos_fichier['tmp_name']) ;
1182 jpm 154
 
620 aurelien 155
		if(!$informations_image) {
156
			$message = 'Erreur lors de l\'extraction des metadonnées';
157
			trigger_error($message, E_USER_ERROR);
158
		}
1182 jpm 159
 
160
		// ajout de quelques informations supplémentaire, en sus
620 aurelien 161
		// des metadonnées dejà extraites
162
		$informations_image['ci_ordre'] = $nouvel_ordre ;
163
		$informations_image['ci_publiable_eflore'] = 'false' ;
164
		$informations_image['ci_nom_original'] = $infos_fichier['name'] ;
1182 jpm 165
 
620 aurelien 166
		// le md5 du fichier sert à repérer les images en doublons
167
		$informations_image['ci_md5'] = md5_file($infos_fichier['tmp_name']) ;
632 aurelien 168
		$informations_image['ci_ce_utilisateur'] = $identifiant_utilisateur ;
1182 jpm 169
 
620 aurelien 170
		$requete_insertion_infos_image = $this->construireRequeteInsertionImage($informations_image);
171
		$resultat_insertion_infos_image = $this->executerRequeteSimple($requete_insertion_infos_image);
172
 
663 aurelien 173
		if (!$resultat_insertion_infos_image) {
620 aurelien 174
			$message = "Echec de l'insertion dans la base de donnees : " ;
175
			trigger_error($message, E_USER_ERROR);
607 aurelien 176
        }
620 aurelien 177
 
632 aurelien 178
		$id_nouvelle_image = $this->obtenirIdImagePourIdentifiantEtOrdre($identifiant_utilisateur, $nouvel_ordre);
1182 jpm 179
 
663 aurelien 180
		if (!$id_nouvelle_image)
416 aurelien 181
		{
620 aurelien 182
			$message =  'Impossible d\'obtenir le nouvel identifiant de l\'image' ;
183
			trigger_error($message, E_USER_ERROR);
416 aurelien 184
		}
1182 jpm 185
 
620 aurelien 186
		$manipulateur_image = new ImageRecreation($this->config);
632 aurelien 187
		$fichier_stocke = $manipulateur_image->stockerFichierEtCreerMiniatures($infos_fichier,$id_nouvelle_image);
1182 jpm 188
 
663 aurelien 189
		if (!$fichier_stocke) {
620 aurelien 190
			$message =  'Erreur lors du stockage du fichier' ;
191
			trigger_error($message, E_USER_ERROR);
416 aurelien 192
		}
1182 jpm 193
 
620 aurelien 194
		return $id_nouvelle_image;
195
	}
1182 jpm 196
 
620 aurelien 197
	private function obtenirNouvelOrdrePourUtilisateur($id_utilisateur) {
198
 
199
		$nouvel_ordre = 0 ;
1182 jpm 200
 
620 aurelien 201
		$requete_selection_ordre_max ='SELECT MAX(ci_ordre) as max_ordre FROM cel_images WHERE ci_ce_utilisateur = '.$this->proteger($id_utilisateur) ;
202
		$resultat_requete_ordre_max = $this->executerRequete($requete_selection_ordre_max);
1182 jpm 203
 
620 aurelien 204
		if($resultat_requete_ordre_max) {
205
			$nouvel_ordre = $resultat_requete_ordre_max[0]['max_ordre'];
632 aurelien 206
			$nouvel_ordre++;
416 aurelien 207
		}
1182 jpm 208
 
620 aurelien 209
		return $nouvel_ordre;
210
	}
1182 jpm 211
 
620 aurelien 212
	private function obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $ordre) {
1182 jpm 213
 
620 aurelien 214
		$id_image = false;
1182 jpm 215
 
620 aurelien 216
		$requete_id_image ='SELECT ci_id_image FROM cel_images WHERE ci_ce_utilisateur = '.$this->proteger($id_utilisateur).' AND ci_ordre = '.$ordre ;
217
		$resultat_id_image = $this->executerRequete($requete_id_image);
416 aurelien 218
 
663 aurelien 219
        if (count($resultat_id_image) > 0)
620 aurelien 220
		{
221
			$id_image = $resultat_id_image[0]['ci_id_image'];
222
        }
1182 jpm 223
 
620 aurelien 224
        return $id_image;
225
	}
1182 jpm 226
 
620 aurelien 227
	private function construireRequeteInsertionImage($informations_image) {
1182 jpm 228
 
620 aurelien 229
		$requete_insertion_image = "INSERT INTO cel_images ";
1182 jpm 230
 
620 aurelien 231
		$champs_a_inserer = '' ;
232
		$valeurs_a_inserer = '' ;
416 aurelien 233
 
663 aurelien 234
		foreach ($informations_image as $champ => $valeur)
416 aurelien 235
		{
620 aurelien 236
			$champs_a_inserer .= $champ.',' ;
416 aurelien 237
 
663 aurelien 238
			if (is_null($valeur))
416 aurelien 239
			{
620 aurelien 240
				$valeurs_a_inserer .= 'NULL,' ;
416 aurelien 241
			}
242
			else
243
			{
620 aurelien 244
				$valeurs_a_inserer .= $this->proteger($valeur).',' ;
416 aurelien 245
			}
246
		}
1182 jpm 247
 
663 aurelien 248
		if ($informations_image['ci_meta_date_time'] != 'NULL') {
620 aurelien 249
			$champs_a_inserer .= 'ci_meta_date, ';
663 aurelien 250
        	$valeurs_a_inserer .= $this->proteger($informations_image['ci_meta_date_time']).',';
620 aurelien 251
		}
416 aurelien 252
 
620 aurelien 253
        $champs_a_inserer .= 'ci_meta_date_ajout' ;
254
        $valeurs_a_inserer .= 'CURRENT_TIMESTAMP()' ;
416 aurelien 255
 
620 aurelien 256
		$requete_insertion_image .= "(".$champs_a_inserer.") VALUES (".$valeurs_a_inserer.")" ;
1182 jpm 257
 
620 aurelien 258
		return $requete_insertion_image;
416 aurelien 259
	}
1182 jpm 260
 
620 aurelien 261
	private function envoyerMessageCreationEffectuee() {
1182 jpm 262
 
620 aurelien 263
		header('HTTP/1.0 200 Created');
632 aurelien 264
		echo 'OK';
620 aurelien 265
		exit() ;
266
	}
416 aurelien 267
 
620 aurelien 268
	/**
269
	 * Méthode appelée avec une requête de type DELETE.
270
	 * Supprime les infos sur l'image et le fichier correspondant à l'id passé en parametre
271
	*/
416 aurelien 272
	function deleteElement($uid){
1182 jpm 273
 
1179 aurelien 274
		if(self::ARRET_SERVICE) {
275
			header('Status: 503 Service Temporarily Unavailable');
276
			echo "L'envoi d'images au cel est temporairement désactivé";
277
			exit;
278
		}
416 aurelien 279
 
620 aurelien 280
		// uid[0] : utilisateur obligatoire
281
		// uid[1] : identifiant image(s) obligatoire(s)
416 aurelien 282
 
620 aurelien 283
	 	// Controle detournement utilisateur
1078 aurelien 284
		if(!isset($_SESSION)) {session_start();}
416 aurelien 285
		$this->controleUtilisateur($uid[0]);
286
 
663 aurelien 287
		if (!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) {
620 aurelien 288
			return;
416 aurelien 289
		}
1182 jpm 290
 
620 aurelien 291
		$ids_images = $uid[1];
416 aurelien 292
 
620 aurelien 293
	    $requete_suppression_images = "DELETE FROM cel_images WHERE ci_id_image in (".$ids_images.")";
294
		$requete_suppression_lien_images_obs = "DELETE FROM cel_obs_images WHERE coi_ce_image in (".$ids_images.")";
1182 jpm 295
 
620 aurelien 296
		$resultat_suppression_image = $this->executerRequeteSimple($requete_suppression_images);
297
		$resultat_suppression_lien_images_obs = $this->executerRequeteSimple($requete_suppression_lien_images_obs);
1182 jpm 298
 
663 aurelien 299
		if (!$resultat_suppression_image) {
620 aurelien 300
			$message =  'Erreur lors de la suppression de l\'image' ;
301
			trigger_error($message, E_USER_ERROR);
416 aurelien 302
		}
1182 jpm 303
 
663 aurelien 304
		if (!$resultat_suppression_lien_images_obs) {
620 aurelien 305
			$message =  'Erreur lors de la suppression des observations associées à l\'image' ;
306
			trigger_error($message, E_USER_ERROR);
307
		}
416 aurelien 308
 
620 aurelien 309
		$manipulateur_image = new ImageRecreation($this->config);
1182 jpm 310
 
663 aurelien 311
		$tableau_ids_image = split(',',$ids_images);
1182 jpm 312
 
663 aurelien 313
		foreach($tableau_ids_image as $id_image_a_detruire) {
314
        	$destruction_fichier_image = $manipulateur_image->detruireImageSurDisque($id_image_a_detruire);
315
		}
620 aurelien 316
 
317
		$this->envoyer('OK');
416 aurelien 318
	}
1182 jpm 319
 
620 aurelien 320
	private function estUneSuiteIdentifiantsImage($chaine) {
1182 jpm 321
 
620 aurelien 322
		// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
323
		// sans virgule terminale
324
		$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
1182 jpm 325
 
620 aurelien 326
		return preg_match($reg_exp, $chaine);
1182 jpm 327
 
620 aurelien 328
	}
416 aurelien 329
 
330
}
331
?>