Subversion Repositories eFlore/Applications.cel

Rev

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