Subversion Repositories eFlore/Projets.eflore-projets

Rev

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