Subversion Repositories eFlore/Applications.cel

Rev

Rev 607 | Rev 632 | 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)
416 aurelien 19
	{
620 aurelien 20
 
21
		// uid[0] : utilisateur obligatoire
22
		// uid[1] : identifiant image obligatoire
416 aurelien 23
 
24
		// Controle detournement utilisateur
620 aurelien 25
	   	session_start();
26
	   	$this->controleUtilisateur($uid[0]);
416 aurelien 27
 
620 aurelien 28
		$id_image_protegee = $this->proteger($uid[1]);
29
		$requete_selection_image = "SELECT * FROM cel_images WHERE ci_id_image = ".$id_image_protegee;
416 aurelien 30
 
620 aurelien 31
		$resultat_selection = $this->executerRequete($requete_selection_image);
32
 
33
		$image = false;
34
 
35
		if(count($resultat_selection) > 0) {
36
			$image = $resultat_selection[0];
416 aurelien 37
		}
38
 
620 aurelien 39
		$this->envoyer($image,'text/html','utf-8',true);
416 aurelien 40
	}
41
 
620 aurelien 42
	/**
43
	 * Méthode appelée avec une requête de type POST avec un identifiant d'image.
44
	 * Met a jour l'image correspondant à l'id passé en paramètre avec les valeurs passées dans le post
45
	*/
46
	public function updateElement($uid,$pairs)
416 aurelien 47
	{
48
		// Controle detournement utilisateur
49
		$this->controleUtilisateur($uid[0]);
620 aurelien 50
 
51
		$requete_mise_a_jour_image = 'UPDATE cel_images SET ' ;
52
 
53
		$champs_a_mettre_a_jour = $this->construireRequeteMajMetaDonnees($pairs);
54
		$requete_mise_a_jour_image .= $champs_a_mettre_a_jour;
416 aurelien 55
 
620 aurelien 56
		$requete_mise_a_jour_image .= ' WHERE ci_id_image = '.$this->proteger($pairs['ci_id_image']) ;
416 aurelien 57
 
620 aurelien 58
		$resultat_mise_a_jour = $this->executerRequete($requete_mise_a_jour_image);
59
 
60
		$retour = false;
61
 
62
		if($resultat_mise_a_jour) {
63
			$retour = 'OK';
64
		}
65
 
66
		$this->envoyer($retour);
67
	}
68
 
69
	/**
70
	 * Assemble la requete de mise à jour des champs de metadonnées
71
	 *
72
	*/
73
	private function construireRequeteMajMetaDonnees($valeurs_metadonnees) {
74
 
75
		$requete_maj_champs = '';
76
 
77
		$champs_a_ignorer = array('ci_ce_observation');
78
 
79
		foreach($valeurs_metadonnees as $champ  => $valeur)
416 aurelien 80
		{
620 aurelien 81
 
82
			if(!in_array($champ,$champs_a_ignorer)) {
83
				if($champ == 'ci_meta_date') {
84
 
85
					$date_tab = split('/',$valeur) ;
86
					$date = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0] ;
87
 
88
					$requete_maj_champs .= $champ.' = "'.$date.'" , ' ;
89
 
90
				}
91
				else {
92
					$requete_maj_champs .= $champ.' = '.$this->proteger($valeur).' , ' ;
93
				}
416 aurelien 94
			}
95
		}
96
 
620 aurelien 97
		$requete_maj_champs = rtrim($query," , ") ;
98
 
99
		return $requete_maj_champs;
416 aurelien 100
	}
101
 
102
 
620 aurelien 103
	/**
104
	 * Méthode appelée avec une requête de type PUT.
105
	 * Stocke une image, crée ses miniatures et enregistre ses informations
106
	 * Renvoie l'identifiant d'image nouvellement crée en cas de succès
107
	*/
416 aurelien 108
	function createElement($pairs)
109
	{
110
		// Controle detournement utilisateur
111
		session_start();
620 aurelien 112
		$this->controleUtilisateur($pairs['identifiant']);
113
 
416 aurelien 114
		foreach($_FILES as $file) {
115
			$infos_fichier = $file ;
116
		}
607 aurelien 117
 
620 aurelien 118
		if($this->ajouterImageSurDdEtBdd($pairs, $infos_fichier)) {
119
 
120
			// l'upload demande de court-circuiter le fonctionnement normal de JREST
121
			// en quittant directement après l'envoi
122
			$this->envoyerMessageCreationEffectuee();
123
			exit;
124
		}
416 aurelien 125
 
620 aurelien 126
	}
127
 
128
	/**
129
	 * Ajout une image dans la base de données et stocke le fichier en fabriquant les miniatures,
130
	 * renvoie le nouvel id d'image en cas de succès
131
	 *
132
	 * @param array $pairs le tableau contenant l'identifiant de l'utilisateur
133
	 * @param array $infos_fichier les infos sur le fichier à traiter, de la même forme que les
134
	 * élements du tableau $_FILES de php
135
	*/
136
	public function ajouterImageSurDdEtBdd($pairs, $infos_fichier) {
607 aurelien 137
 
620 aurelien 138
		$nouvel_ordre = $this->obtenirNouvelOrdrePourUtilisateur($pairs['identifiant']);
139
 
140
		if(!$nouvel_ordre) {
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']) ;
161
		$informations_image['ci_ce_utilisateur'] = $pairs['identifiant'] ;
162
 
163
		$requete_insertion_infos_image = $this->construireRequeteInsertionImage($informations_image);
164
		$resultat_insertion_infos_image = $this->executerRequeteSimple($requete_insertion_infos_image);
165
 
166
		if(!$resultat_insertion_infos_image) {
167
			$message = "Echec de l'insertion dans la base de donnees : " ;
168
			trigger_error($message, E_USER_ERROR);
607 aurelien 169
        }
620 aurelien 170
 
171
		$id_nouvelle_image = $this->obtenirIdImagePourIdentifiantEtOrdre($pairs['identifiant'], $nouvel_ordre);
172
 
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);
180
		$fichier_stocke = $manipulateur_image->stockerFichierEtCreerMiniatures($infos_fichier,$id_nouvelle_image) ;
181
 
182
		if(!$fichier_stocke) {
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);
196
 
197
		if($resultat_requete_ordre_max) {
198
			$nouvel_ordre = $resultat_requete_ordre_max[0]['max_ordre'];
199
			$nouvel_ordre = $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
 
620 aurelien 212
        if(count($resultat_id_image) > 0)
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
 
620 aurelien 227
		foreach($informations_image as $champ => $valeur)
416 aurelien 228
		{
620 aurelien 229
			$champs_a_inserer .= $champ.',' ;
416 aurelien 230
 
620 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
 
241
		if($fichier_meta['ci_meta_date_time'] != 'NULL') {
242
			$champs_a_inserer .= 'ci_meta_date, ';
243
        	$valeurs_a_inserer .= $this->proteger($fichier_meta['ci_meta_date_time']).',';
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');
257
		exit() ;
258
	}
416 aurelien 259
 
620 aurelien 260
	/**
261
	 * Méthode appelée avec une requête de type DELETE.
262
	 * Supprime les infos sur l'image et le fichier correspondant à l'id passé en parametre
263
	*/
416 aurelien 264
	function deleteElement($uid){
265
 
620 aurelien 266
		// uid[0] : utilisateur obligatoire
267
		// uid[1] : identifiant image(s) obligatoire(s)
416 aurelien 268
 
620 aurelien 269
	 	// Controle detournement utilisateur
416 aurelien 270
	    session_start();
271
		$this->controleUtilisateur($uid[0]);
272
 
620 aurelien 273
		if(!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) {
274
			return;
416 aurelien 275
		}
620 aurelien 276
 
277
		$ids_images = $uid[1];
416 aurelien 278
 
620 aurelien 279
	    $requete_suppression_images = "DELETE FROM cel_images WHERE ci_id_image in (".$ids_images.")";
280
		$requete_suppression_lien_images_obs = "DELETE FROM cel_obs_images WHERE coi_ce_image in (".$ids_images.")";
281
 
282
		$resultat_suppression_image = $this->executerRequeteSimple($requete_suppression_images);
283
		$resultat_suppression_lien_images_obs = $this->executerRequeteSimple($requete_suppression_lien_images_obs);
284
 
285
		if(!$resultat_suppression_image) {
286
			$message =  'Erreur lors de la suppression de l\'image' ;
287
			trigger_error($message, E_USER_ERROR);
416 aurelien 288
		}
607 aurelien 289
 
620 aurelien 290
		if(!$resultat_suppression_lien_images_obs) {
291
			$message =  'Erreur lors de la suppression des observations associées à l\'image' ;
292
			trigger_error($message, E_USER_ERROR);
293
		}
416 aurelien 294
 
620 aurelien 295
		$manipulateur_image = new ImageRecreation($this->config);
296
        $destruction_fichier_image = $manipulateur_image->detruireImageSurDisque($id);
297
 
298
		$this->envoyer('OK');
416 aurelien 299
	}
620 aurelien 300
 
301
	private function estUneSuiteIdentifiantsImage($chaine) {
302
 
303
		// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
304
		// sans virgule terminale
305
		$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
306
 
307
		return preg_match($reg_exp, $chaine);
308
 
309
	}
416 aurelien 310
 
311
}
312
?>