Subversion Repositories eFlore/Applications.cel

Rev

Rev 1078 | Go to most recent revision | 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 {
620 aurelien 13
 
1179 aurelien 14
	const ARRET_SERVICE = false;
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)
663 aurelien 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
 
620 aurelien 29
		$id_image_protegee = $this->proteger($uid[1]);
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);
33
 
34
		$image = false;
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]);
620 aurelien 51
 
52
		$requete_mise_a_jour_image = 'UPDATE cel_images SET ' ;
53
 
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);
620 aurelien 60
 
61
		$retour = false;
62
 
663 aurelien 63
		if ($resultat_mise_a_jour) {
620 aurelien 64
			$retour = 'OK';
65
		}
66
 
67
		$this->envoyer($retour);
68
	}
69
 
70
	/**
71
	 * Assemble la requete de mise à jour des champs de metadonnées
72
	 *
73
	*/
74
	private function construireRequeteMajMetaDonnees($valeurs_metadonnees) {
75
 
76
		$requete_maj_champs = '';
77
 
663 aurelien 78
		$champs_a_ignorer = array('ci_ce_observation','ci_id_image');
620 aurelien 79
 
80
		foreach($valeurs_metadonnees as $champ  => $valeur)
416 aurelien 81
		{
620 aurelien 82
 
632 aurelien 83
			if (!in_array($champ,$champs_a_ignorer)) {
84
				if ($champ == 'ci_meta_date') {
620 aurelien 85
 
86
					$date_tab = split('/',$valeur) ;
87
					$date = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0] ;
88
 
89
					$requete_maj_champs .= $champ.' = "'.$date.'" , ' ;
90
 
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," , ") ;
620 aurelien 99
 
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
	*/
416 aurelien 109
	function createElement($pairs)
110
	{
1179 aurelien 111
 
112
		if(self::ARRET_SERVICE) {
113
			header('Status: 503 Service Temporarily Unavailable');
114
			echo "L'envoi d'images au cel est temporairement désactivé";
115
			exit;
116
		}
416 aurelien 117
		// Controle detournement utilisateur
1078 aurelien 118
		if(!isset($_SESSION)) {session_start();}
620 aurelien 119
		$this->controleUtilisateur($pairs['identifiant']);
120
 
632 aurelien 121
		foreach ($_FILES as $file) {
416 aurelien 122
			$infos_fichier = $file ;
123
		}
607 aurelien 124
 
632 aurelien 125
		if ($this->ajouterImageSurDdEtBdd($pairs, $infos_fichier)) {
620 aurelien 126
 
127
			// l'upload demande de court-circuiter le fonctionnement normal de JREST
128
			// en quittant directement après l'envoi
129
			$this->envoyerMessageCreationEffectuee();
130
			exit;
131
		}
416 aurelien 132
 
620 aurelien 133
	}
134
 
135
	/**
632 aurelien 136
	 * Ajoute une image dans la base de données et stocke le fichier en fabriquant les miniatures,
620 aurelien 137
	 * renvoie le nouvel id d'image en cas de succès
138
	 *
139
	 * @param array $pairs le tableau contenant l'identifiant de l'utilisateur
140
	 * @param array $infos_fichier les infos sur le fichier à traiter, de la même forme que les
141
	 * élements du tableau $_FILES de php
142
	*/
143
	public function ajouterImageSurDdEtBdd($pairs, $infos_fichier) {
607 aurelien 144
 
632 aurelien 145
		$identifiant_utilisateur = $pairs['identifiant'];
146
		$nouvel_ordre = $this->obtenirNouvelOrdrePourUtilisateur($identifiant_utilisateur);
620 aurelien 147
 
632 aurelien 148
		if (!$nouvel_ordre) {
620 aurelien 149
			$message = 'Erreur lors du calcul du nouvel ordre de l\'image';
150
			trigger_error($message, E_USER_ERROR);
151
		}
152
 
153
		$extracteur_metadonnees = new ExtracteurMetadonnees();
154
		$informations_image = $extracteur_metadonnees->extraireMetadonnees($infos_fichier['tmp_name']) ;
155
 
156
		if(!$informations_image) {
157
			$message = 'Erreur lors de l\'extraction des metadonnées';
158
			trigger_error($message, E_USER_ERROR);
159
		}
160
 
161
		// ajout de quelques informations supplémentaire, en sus
162
		// des metadonnées dejà extraites
163
		$informations_image['ci_ordre'] = $nouvel_ordre ;
164
		$informations_image['ci_publiable_eflore'] = 'false' ;
165
		$informations_image['ci_nom_original'] = $infos_fichier['name'] ;
166
 
167
		// le md5 du fichier sert à repérer les images en doublons
168
		$informations_image['ci_md5'] = md5_file($infos_fichier['tmp_name']) ;
632 aurelien 169
		$informations_image['ci_ce_utilisateur'] = $identifiant_utilisateur ;
620 aurelien 170
 
171
		$requete_insertion_infos_image = $this->construireRequeteInsertionImage($informations_image);
172
		$resultat_insertion_infos_image = $this->executerRequeteSimple($requete_insertion_infos_image);
173
 
663 aurelien 174
		if (!$resultat_insertion_infos_image) {
620 aurelien 175
			$message = "Echec de l'insertion dans la base de donnees : " ;
176
			trigger_error($message, E_USER_ERROR);
607 aurelien 177
        }
620 aurelien 178
 
632 aurelien 179
		$id_nouvelle_image = $this->obtenirIdImagePourIdentifiantEtOrdre($identifiant_utilisateur, $nouvel_ordre);
620 aurelien 180
 
663 aurelien 181
		if (!$id_nouvelle_image)
416 aurelien 182
		{
620 aurelien 183
			$message =  'Impossible d\'obtenir le nouvel identifiant de l\'image' ;
184
			trigger_error($message, E_USER_ERROR);
416 aurelien 185
		}
607 aurelien 186
 
620 aurelien 187
		$manipulateur_image = new ImageRecreation($this->config);
632 aurelien 188
		$fichier_stocke = $manipulateur_image->stockerFichierEtCreerMiniatures($infos_fichier,$id_nouvelle_image);
620 aurelien 189
 
663 aurelien 190
		if (!$fichier_stocke) {
620 aurelien 191
			$message =  'Erreur lors du stockage du fichier' ;
192
			trigger_error($message, E_USER_ERROR);
416 aurelien 193
		}
620 aurelien 194
 
195
		return $id_nouvelle_image;
196
	}
197
 
198
	private function obtenirNouvelOrdrePourUtilisateur($id_utilisateur) {
199
 
200
		$nouvel_ordre = 0 ;
201
 
202
		$requete_selection_ordre_max ='SELECT MAX(ci_ordre) as max_ordre FROM cel_images WHERE ci_ce_utilisateur = '.$this->proteger($id_utilisateur) ;
203
		$resultat_requete_ordre_max = $this->executerRequete($requete_selection_ordre_max);
632 aurelien 204
 
620 aurelien 205
		if($resultat_requete_ordre_max) {
206
			$nouvel_ordre = $resultat_requete_ordre_max[0]['max_ordre'];
632 aurelien 207
			$nouvel_ordre++;
416 aurelien 208
		}
620 aurelien 209
 
210
		return $nouvel_ordre;
211
	}
212
 
213
	private function obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $ordre) {
214
 
215
		$id_image = false;
216
 
217
		$requete_id_image ='SELECT ci_id_image FROM cel_images WHERE ci_ce_utilisateur = '.$this->proteger($id_utilisateur).' AND ci_ordre = '.$ordre ;
218
		$resultat_id_image = $this->executerRequete($requete_id_image);
416 aurelien 219
 
663 aurelien 220
        if (count($resultat_id_image) > 0)
620 aurelien 221
		{
222
			$id_image = $resultat_id_image[0]['ci_id_image'];
223
        }
224
 
225
        return $id_image;
226
	}
227
 
228
	private function construireRequeteInsertionImage($informations_image) {
229
 
230
		$requete_insertion_image = "INSERT INTO cel_images ";
231
 
232
		$champs_a_inserer = '' ;
233
		$valeurs_a_inserer = '' ;
416 aurelien 234
 
663 aurelien 235
		foreach ($informations_image as $champ => $valeur)
416 aurelien 236
		{
620 aurelien 237
			$champs_a_inserer .= $champ.',' ;
416 aurelien 238
 
663 aurelien 239
			if (is_null($valeur))
416 aurelien 240
			{
620 aurelien 241
				$valeurs_a_inserer .= 'NULL,' ;
416 aurelien 242
			}
243
			else
244
			{
620 aurelien 245
				$valeurs_a_inserer .= $this->proteger($valeur).',' ;
416 aurelien 246
			}
247
		}
620 aurelien 248
 
663 aurelien 249
		if ($informations_image['ci_meta_date_time'] != 'NULL') {
620 aurelien 250
			$champs_a_inserer .= 'ci_meta_date, ';
663 aurelien 251
        	$valeurs_a_inserer .= $this->proteger($informations_image['ci_meta_date_time']).',';
620 aurelien 252
		}
416 aurelien 253
 
620 aurelien 254
        $champs_a_inserer .= 'ci_meta_date_ajout' ;
255
        $valeurs_a_inserer .= 'CURRENT_TIMESTAMP()' ;
416 aurelien 256
 
620 aurelien 257
		$requete_insertion_image .= "(".$champs_a_inserer.") VALUES (".$valeurs_a_inserer.")" ;
607 aurelien 258
 
620 aurelien 259
		return $requete_insertion_image;
416 aurelien 260
	}
620 aurelien 261
 
262
	private function envoyerMessageCreationEffectuee() {
263
 
264
		header('HTTP/1.0 200 Created');
632 aurelien 265
		echo 'OK';
620 aurelien 266
		exit() ;
267
	}
416 aurelien 268
 
620 aurelien 269
	/**
270
	 * Méthode appelée avec une requête de type DELETE.
271
	 * Supprime les infos sur l'image et le fichier correspondant à l'id passé en parametre
272
	*/
416 aurelien 273
	function deleteElement($uid){
1179 aurelien 274
 
275
		if(self::ARRET_SERVICE) {
276
			header('Status: 503 Service Temporarily Unavailable');
277
			echo "L'envoi d'images au cel est temporairement désactivé";
278
			exit;
279
		}
416 aurelien 280
 
620 aurelien 281
		// uid[0] : utilisateur obligatoire
282
		// uid[1] : identifiant image(s) obligatoire(s)
416 aurelien 283
 
620 aurelien 284
	 	// Controle detournement utilisateur
1078 aurelien 285
		if(!isset($_SESSION)) {session_start();}
416 aurelien 286
		$this->controleUtilisateur($uid[0]);
287
 
663 aurelien 288
		if (!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) {
620 aurelien 289
			return;
416 aurelien 290
		}
620 aurelien 291
 
292
		$ids_images = $uid[1];
416 aurelien 293
 
620 aurelien 294
	    $requete_suppression_images = "DELETE FROM cel_images WHERE ci_id_image in (".$ids_images.")";
295
		$requete_suppression_lien_images_obs = "DELETE FROM cel_obs_images WHERE coi_ce_image in (".$ids_images.")";
296
 
297
		$resultat_suppression_image = $this->executerRequeteSimple($requete_suppression_images);
298
		$resultat_suppression_lien_images_obs = $this->executerRequeteSimple($requete_suppression_lien_images_obs);
299
 
663 aurelien 300
		if (!$resultat_suppression_image) {
620 aurelien 301
			$message =  'Erreur lors de la suppression de l\'image' ;
302
			trigger_error($message, E_USER_ERROR);
416 aurelien 303
		}
607 aurelien 304
 
663 aurelien 305
		if (!$resultat_suppression_lien_images_obs) {
620 aurelien 306
			$message =  'Erreur lors de la suppression des observations associées à l\'image' ;
307
			trigger_error($message, E_USER_ERROR);
308
		}
416 aurelien 309
 
620 aurelien 310
		$manipulateur_image = new ImageRecreation($this->config);
663 aurelien 311
 
312
		$tableau_ids_image = split(',',$ids_images);
313
 
314
		foreach($tableau_ids_image as $id_image_a_detruire) {
315
        	$destruction_fichier_image = $manipulateur_image->detruireImageSurDisque($id_image_a_detruire);
316
		}
620 aurelien 317
 
318
		$this->envoyer('OK');
416 aurelien 319
	}
620 aurelien 320
 
321
	private function estUneSuiteIdentifiantsImage($chaine) {
322
 
323
		// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
324
		// sans virgule terminale
325
		$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
326
 
327
		return preg_match($reg_exp, $chaine);
328
 
329
	}
416 aurelien 330
 
331
}
332
?>