Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 106 | Rev 118 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 106 Rev 116
Line 1... Line 1...
1
<?php
1
<?php
2
class Images {
2
class Images {
3
	
3
 
-
 
4
	private $parametres = array();
-
 
5
	private $ressources = array();
4
	private $Bdd;
6
	private $Bdd;
-
 
7
 
5
	private $formats_supportes = array('jpeg');
8
	private $formats_supportes = array('image/jpeg');
6
	private $format_retour_demande = 'jpeg';
-
 
7
	private $format_image_demande = 'M';
9
	private $ref_tax_demande = array();
-
 
10
 
8
	private $num_nom_demande = null;
11
	public function __construct(Bdd $bdd) {
9
	private $ref_tax_demande = 'bdtfx';
12
		$this->Bdd = $bdd;
10
	
13
	}
11
	private $pattern_ref_tax_nn_composes = '/(([a-zA-Z]:((([0-9])+,)*([0-9])+));)*([a-zA-Z]:((([0-9])+,)*([0-9])+))*/i';
-
 
12
	
14
 
13
	public function consulter($ressources, $parametres) {
15
	public function consulter($ressources, $parametres) {
14
		$this->bdd_cel = Config::get('bdd_nom');
16
		$this->parametres = $parametres;
15
		$parametres = $this->traiterParametres();		
17
		$this->ressources = $ressources;
16
	
18
 
17
		try {
19
		$this->definirValeurParDefautDesParametres();
18
			$this->verifierErreurs($parametres);
20
		$this->verifierParametres();
19
			$this->affecterParametres($parametres);
21
		$this->analyserMasqueNn();
20
			$id_image_a_renvoyer = $this->obtenirImageAuHasardPourNumNom($this->ref_tax_demande, $this->num_nom_demande);
22
		$id_image_a_renvoyer = $this->obtenirIdImageAuHasardPourNumNom();
21
			$this->traiterRetour($id_image_a_renvoyer);
23
		$image = $this->recupererImageBinaire($id_image_a_renvoyer);
-
 
24
 
22
		} catch (Exception $e) {
25
		$resultat = new ResultatService();
23
			$header = $this->renvoyerHeaderAssocie($e->getCode());
26
		$resultat->mime = 'image/jpeg';
24
			$erreurs = $e->getMessage();
27
		$resultat->corps = $image;
-
 
28
		return $resultat;
-
 
29
	}
25
			
30
 
-
 
31
	private function definirValeurParDefautDesParametres() {
26
			header($header);
32
		if (isset($this->parametres['retour']) == false) {
27
			$this->envoyerTexteSimple($erreurs);
33
			$this->parametres['retour'] = 'image/jpeg';
28
			exit;
34
		}
-
 
35
		if (isset($this->parametres['retour.format']) == false) {
-
 
36
			$this->parametres['retour.format'] = 'M';
29
		}
37
		}
30
	}
38
	}
31
	
39
 
32
	protected function traiterParametres() {
40
	private function verifierParametres() {
33
		$parametres_bruts = array();
41
		$erreurs = array();
-
 
42
 
34
		if (!empty($_SERVER['QUERY_STRING'])) {
43
		if (isset($this->parametres['masque.nn']) == false) {
35
			$paires = explode('&', $_SERVER['QUERY_STRING']);
44
			$erreurs[] = "Le paramètre masque.nn est obligatoire.";
36
			foreach ($paires as $paire) {
45
		} else {
37
				$nv = explode('=', $paire);
46
			if ($this->verifierMasqueNnAutoriseActuellement() == false) {
38
				$nom = urldecode($nv[0]);
47
				$erreurs[] = "Le paramètre masque.nn peut contenir une seule valeur numérique pour l'instant.";
39
				$valeur = urldecode($nv[1]);
48
			} else if ($this->verifierValeurParametreMasqueNn() == false) {
40
				$parametres_bruts[$nom] = $valeur;
49
				$erreurs[] = "Le paramètre masque.nn est mal formé.";
41
			}
50
			}
42
			$parametres_bruts = $this->nettoyerParametres($parametres_bruts);
-
 
43
		}
51
		}
44
		return $parametres_bruts;
-
 
45
	}
-
 
46
	
-
 
47
	private function nettoyerParametres(Array $parametres) {
-
 
48
		// Pas besoin d'utiliser urldecode car déjà fait par php pour les clés et valeur de $_GET
-
 
49
		if (isset($parametres) && count($parametres) > 0) {
52
		if (isset($this->parametres['retour']) == false) {
50
			foreach ($parametres as $cle => $valeur) {
-
 
51
				$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
-
 
52
				$parametres[$cle] = strip_tags(str_replace($verifier, '', $valeur));
53
			$erreurs[] = "Le paramètre type de retour 'retour' est obligatoire.";
53
			}
-
 
54
		}
54
		}
55
		return $parametres;
-
 
56
	}
-
 
57
	
-
 
58
	private function verifierErreurs($parametres) {
55
		if ($this->verifierValeurParametreRetour() == false) {
59
		$erreurs = false;
-
 
60
	
-
 
61
		if (!isset($parametres['masque.nn'])) {
-
 
62
			$erreurs .= 'Le paramètre masque.nn est obligatoire '."\n";
-
 
63
		} else {
-
 
64
			if(!preg_match($this->pattern_ref_tax_nn_composes, $parametres['masque.nn'])) {
-
 
65
				$erreurs .= 'Le paramètre masque.nn est mal formé '."\n";
56
			$erreurs[] = "Le type de retour '{$this->parametres['retour']}' n'est pas supporté";
66
			}
-
 
67
		}
57
		}
68
	
-
 
69
		if (isset($parametres['retour']) && !$this->retourEstSupporte($parametres['retour'])) {
58
		if (isset($this->parametres['retour.format']) == false) {
70
			$erreurs .= 'Le type de retour '.$parametres['retour'].' n\'est pas supporté  '."\n";
59
			$erreurs[] = "Le paramètre de format de retour 'retour.format' est obligatoire.";
71
		}
60
		}
72
	
-
 
73
		if (isset($parametres['retour.format']) && !$this->formatEstSupporte($parametres['retour.format'])) {
61
		if ($this->verifierValeurParametreFormat() == false) {
74
			$erreurs .= 'Le type de format '.$parametres['retour.format'].' n\'est pas supporté  '."\n";
62
			$erreurs[] = "Le type de format '{$this->parametres['retour.format']}' n'est pas supporté";
75
		}
63
		}
76
	
64
 
77
		if($erreurs != '') {
65
		if (count($erreurs) > 0) {
-
 
66
			$message = implode('<br />', $erreurs);
-
 
67
			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
78
			throw new Exception($erreurs, "400");
68
			throw new Exception($message, $code);
79
		}
69
		}
80
	}
70
	}
81
	
71
 
82
	private function retourEstSupporte($retour = 'image/jpeg') {
72
	private function verifierValeurParametreRetour() {
83
		return in_array($retour, $this->formats_supportes);
73
		return in_array($this->parametres['retour'], $this->formats_supportes);
84
	}
74
	}
85
	
75
 
86
	private function formatEstSupporte($format = 'M') {
76
	private function verifierValeurParametreFormat() {
87
	
-
 
88
		$format_supporte = true;
-
 
89
		// cas du format déjà existant (S, M, L etc...)
77
		$formats = Outils::recupererTableauConfig('formatsImages');
90
		$format_supporte = $this->estUnFormatDejaCree($format);
78
		$ok = array_key_exists($this->parametres['retour.format'], $formats);
91
	
-
 
92
		return $format_supporte;
79
		return $ok;
93
	}
80
	}
94
	
81
 
95
	private function estUnFormatDejaCree($format = 'M') {
82
	private function verifierMasqueNnAutoriseActuellement() {
96
		$formats = $this->getFormats();
-
 
97
		$format_supporte = isset($formats['format_'.$format]) ? true : false;
83
		$ok = is_numeric($this->parametres['masque.nn']) ? true : false;
98
	
-
 
99
		return $format_supporte;
-
 
100
	}
-
 
101
	
-
 
102
	private function getFormats() {
-
 
103
		$formats = array();
-
 
104
	
-
 
105
		foreach (Config::get('formats_images') as $param_config => $valeur) {
-
 
106
			$formats[$param_config] = $valeur;
-
 
107
		}
-
 
108
	
-
 
109
		return $formats;
84
		return $ok;
110
	}
85
	}
111
	
86
 
112
	private function affecterParametres($parametres) {
87
	private function verifierValeurParametreMasqueNn() {
113
		// cette fonction est appelée en considérant que les vérifications d'erreurs ont été passées
-
 
114
		// avec succès
-
 
115
		$this->analyserMasqueNumNom($parametres['masque.nn']);
88
		$nn = $this->parametres['masque.nn'];
116
		if(isset($parametres['retour'])) {
-
 
117
			$this->format_retour_demande =  $parametres['retour'] ;
89
		$projetPattern = '(?:(?:[A-Z0-9]+:)?(?:[0-9]+,)*[0-9]+)';
118
		}
-
 
119
		if(isset($parametres['retour.format'])) {
90
		$patternComplet = "/$projetPattern(?:;$projetPattern)*/i";
120
			$this->format_image_demande = $parametres['retour.format'];
91
		$ok = preg_match($patternComplet, $nn) ? true : false;
121
		}
92
		return $ok;
122
	}
93
	}
123
	
94
 
124
		private function analyserMasqueNumNom($masque_num_nom) {
95
	private function analyserMasqueNn() {
125
		// cette fonction est appelée en considérant que le masque num nom est valide
-
 
126
			// cas du numero sans référentiel : ref tax par defaut
96
		$nn = $this->parametres['masque.nn'];
127
		if(is_numeric($masque_num_nom)) {
97
		if (is_numeric($nn)) {
128
			$this->num_nom_demande = $masque_num_nom;
98
			$this->ref_tax_demande['bdtfx'] = $nn;
129
		} else {
99
		} else {
130
		// ceci contient potentiellement des formes ref_tax1:nn1,nn2;ref_tax2:nn3,nn4
100
			// ceci contient potentiellement des formes ref_tax1:nn1,nn2;ref_tax2:nn3,nn4
131
		$composants_masques = explode(';', $masque_num_nom);
101
			$projetsListeEtNumNoms = explode(';', $nn);
132
		if (count($composants_masques) > 0) {
102
			if (count($projetsListeEtNumNoms) > 0) {
133
				foreach($composants_masques as $composant_ref_nn) {
103
				foreach ($projetsListeEtNumNoms as $projetEtNumNoms) {
134
					$ref_nn = explode(':', $composant_ref_nn);
104
					list($projet, $numNoms) = explode(':', $projetEtNumNoms);
135
					$this->ref_tax_demande[$composant_ref_nn[0]] = explode(',', $composant_ref_nn[1]);
105
					$this->ref_tax_demande[$projet] = explode(',', $numNoms);
136
				}
106
				}
137
			}
107
			}
138
		}
108
		}
139
	}
109
	}
140
	
110
 
141
	private function obtenirImageAuHasardPourNumNom($ref_tax, $num_nom) {
111
	private function obtenirIdImageAuHasardPourNumNom() {
-
 
112
		$numNom = $this->Bdd->proteger($this->ref_tax_demande['bdtfx']);
-
 
113
 
142
		//TODO: modifier la requete lors du passage à la nouvelle base de données pour faire quelque chose
114
		//TODO: modifier la requete lors du passage à la nouvelle base de données pour faire quelque chose
143
		// du numéro nomenclatural + modifier les champs appelés pour le nouveau format
115
		// du numéro nomenclatural + modifier les champs appelés pour le nouveau format
144
		$requete = 	'SELECT  cim.ci_id_image as id_image '.
116
		$requete = 	'SELECT  cim.ci_id_image as id_image '.
145
							'FROM cel_obs_images AS coi '.
117
			'FROM cel_obs_images AS coi '.
146
							'LEFT JOIN cel_inventory AS ci '.
118
			'LEFT JOIN cel_inventory AS ci '.
147
								'ON (coi.coi_ce_observation = ci.ordre AND coi.coi_ce_utilisateur = ci.identifiant) '.
119
				'ON (coi.coi_ce_observation = ci.ordre AND coi.coi_ce_utilisateur = ci.identifiant) '.
148
							'LEFT JOIN cel_images AS cim '.
120
			'LEFT JOIN cel_images AS cim '.
149
								'ON (coi.coi_ce_image = cim.ci_id_image AND coi.coi_ce_utilisateur = cim.ci_ce_utilisateur) '.  
121
				'ON (coi.coi_ce_image = cim.ci_id_image AND coi.coi_ce_utilisateur = cim.ci_ce_utilisateur) '.
150
							'WHERE ci.transmission = 1 '.
122
			'WHERE ci.transmission = 1 '.
151
							'	AND num_nom_sel = '.$this->getBdd()->proteger($num_nom).
123
			"	AND num_nom_ret IN ($numNom)".
152
							'	AND ci.identifiant = cim.ci_ce_utilisateur ';
124
			'	AND ci.identifiant = cim.ci_ce_utilisateur ';
153
			
125
 
154
		$resultat_images = $this->getBdd()->recupererTous($requete);
126
		$resultat = $this->Bdd->recupererTous($requete);
155
	
127
 
156
		if (!is_array($resultat_images) || count($resultat_images) <= 0) {
128
		if (!is_array($resultat) || count($resultat) <= 0) {
157
			$erreur = 'Aucune image ne correspond au numéro numenclatural '.$ref_tax.':'.$num_nom."\n";
129
			$message = "Aucune image ne correspond au numéro numenclatural $refTax:$numNom\n";
-
 
130
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
158
			throw new Exception("404");
131
			throw new Exception($message, $code);
159
		}
132
		}
160
	
133
 
161
		$id_image_hasard = $resultat_images[array_rand($resultat_images)]['id_image'];
134
		$id_image_hasard = $resultat[array_rand($resultat)]['id_image'];
162
		return $id_image_hasard;
135
		return $id_image_hasard;
163
	}
136
	}
164
	
137
 
165
	private function traiterRetour($id_image_a_renvoyer) {
138
	private function recupererImageBinaire($id_image) {
166
		switch($this->format_retour_demande) {
-
 
167
			case 'jpeg':
139
		$image = '';
168
				$this->renvoyerImageExistanteOuGeneree($id_image_a_renvoyer, $this->format_image_demande);
-
 
169
				break;
-
 
170
					
-
 
171
			default:
-
 
172
				$this->renvoyerImageExistanteOuGeneree($id_image_a_renvoyer, 'image/jpeg');
140
		$chemin = $this->obtenirCheminImage($id_image);
173
			break;
-
 
174
		}
-
 
175
	}
-
 
176
	
141
 
177
	private function renvoyerImageExistanteOuGeneree($id_image_a_renvoyer, $format = 'M') {
-
 
178
		if ($this->estUnFormatDejaCree($format)) {
142
		if (file_exists($chemin)) {
179
			$this->renvoyerImageExistante($id_image_a_renvoyer, $format);
143
			$image = file_get_contents($chemin);
180
		} else {
144
		} else {
181
			throw new Exception("La génération de formats à la demande n'est pas encore implémentée", "501");
-
 
182
		}
-
 
183
	}
-
 
184
	
-
 
185
	private function renvoyerImageExistante($id_image, $format = 'M') {
145
			$message = "L'image demandée est introuvable sur le serveur : $chemin";
186
		$chemin = $this->functionObtenirCheminImagePourFormat($id_image, $format);
146
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
187
		if(file_exists($chemin)) {
-
 
188
			header("HTTP/1.0 200 OK");
-
 
189
			header("Content-type: image/jpeg");
147
			throw new Exception($message, $code);
190
			echo file_get_contents($chemin);
-
 
191
			exit;
-
 
192
		} else {
-
 
193
			throw new Exception("L\'image demandée est introuvable sur le serveur", "404");
-
 
194
		}
148
		}
-
 
149
		return $image;
195
	}
150
	}
196
	
151
 
197
	public function functionObtenirCheminImagePourFormat($id_image, $format) {
152
	public function obtenirCheminImage($idImage) {
198
		$nom = $this->convertirIdBddVersNomFichier($id_image, $format);
153
		$nom = $this->convertirIdImageVersNomFichier($idImage);
199
		$dossier = $this->obtenirDossierPourFormat($id_image,$format);
154
		$dossier = $this->convertirIdImageVersChemin($idImage);
200
	
-
 
201
		return $dossier.'/'.$nom;
155
		return $dossier.'/'.$nom;
202
	}
156
	}
203
	
157
 
204
	private function obtenirDossierPourFormat($id, $format) {
-
 
205
		$chemin_base = Config::get('chemin_images');
-
 
206
	
-
 
207
		$chemin_sur_serveur = $chemin_base;
-
 
208
	
-
 
209
		$id = sprintf('%09s', $id);
-
 
210
		$id = wordwrap($id, 3 , '_', true);
-
 
211
	
-
 
212
		list($dossierNiveau1, $dossierNiveau2) = explode('_', $id);
-
 
213
	
-
 
214
		$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/'.$format;
-
 
215
	
-
 
216
		return $chemin_sur_serveur_final;
-
 
217
	}
-
 
218
	
-
 
219
	public function convertirIdBddVersNomFichier($id, $format, $extension = 'jpg') {
158
	public function convertirIdImageVersNomFichier($idImage) {
220
		// creation du format original
-
 
221
		$id_avec_zeros = sprintf('%09s', $id) ;
159
		$codeImage = $this->construireCodeImage($idImage);
222
		$id_avec_zeros_underscores = wordwrap($id_avec_zeros, 3 , '_', true) ;
-
 
223
	
-
 
224
		$nom_fichier = $id_avec_zeros_underscores.'_'.$format.'.'.$extension;
160
		$nom_fichier = $codeImage.'.jpg';
225
	
-
 
226
		return $nom_fichier;
161
		return $nom_fichier;
227
	}
162
	}
228
	
163
 
229
	private function envoyerTexteSimple($chaine) {
164
	private function convertirIdImageVersChemin($idImage) {
230
		header("Content-type: text/plain");
165
		$codeImage = $this->construireCodeImage($idImage);
231
		echo $chaine;
-
 
232
	}	
-
 
233
								
-
 
234
	private function renvoyerHeaderAssocie($code) {
166
		list($dossierNiveau1, $dossierNiveau2, $idFichier, $format) = explode('_', $codeImage);
235
		switch ($code) {	
-
 
236
			case '501':
-
 
237
				$header = "HTTP/1.0 501 Not Implemented";
167
		$chemin_base = Config::get('chemin_images');
238
			break;
-
 
239
			
-
 
240
			case '500':
-
 
241
				$header = "HTTP/1.0 500 Internal Server Error";
168
		$chemin_sur_serveur = $chemin_base.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/'.$format;
242
			break;
-
 
243
			
-
 
244
			case '404':
-
 
245
				$header = "HTTP/1.0 404 Not Found";
-
 
246
			break;
-
 
247
			
-
 
248
			case '400':
-
 
249
				$header = "HTTP/1.0 400 Bad Request";
-
 
250
			break;
-
 
251
				
-
 
252
			case '200':
-
 
253
				$header = "HTTP/1.0 200 OK";
169
		return $chemin_sur_serveur;
254
			break;
-
 
255
			
-
 
256
			default:
-
 
257
			break;
-
 
258
		}
-
 
259
	}
170
	}
260
	
171
 
261
	/**
-
 
262
	* Méthode de connection à la base de données sur demande.
172
	private function construireCodeImage($idImage) {
263
	* Tous les services web n'ont pas besoin de s'y connecter.
173
		$codeImage = sprintf('%09s', $idImage);
264
	*/
-
 
265
	protected function getBdd() {
174
		$codeImage = wordwrap($codeImage, 3, '_', true);
266
		if (! isset($this->Bdd)) {
175
		$format = $this->parametres['retour.format'];
267
			$this->Bdd = new Bdd();
176
		$codeImage .= '_'.$format;
268
		}
-
 
269
		return $this->Bdd;
177
		return $codeImage;
270
	}
178
	}
271
}
179
}
272
?>
180
?>
273
181