summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--public/index.php180
1 files changed, 82 insertions, 98 deletions
diff --git a/public/index.php b/public/index.php
index d8d26e2..2cd0c78 100644
--- a/public/index.php
+++ b/public/index.php
@@ -1,16 +1,37 @@
1<?php 1<?php
2function imagickCleanImage(string $image_data, string $local_path, string $format = 'jpeg'): bool // "string" parce que file_get_contents... 2function imagickCleanAndWriteImage(string $image_data, string $local_path): bool // "string" parce que file_get_contents...
3{ 3{
4 $format = strtolower(pathinfo($local_path)['extension']);
4 try{ 5 try{
5 $imagick = new Imagick(); 6 $imagick = new Imagick();
6 $imagick->readImageBlob($image_data); 7 $imagick->readImageBlob($image_data);
7 $imagick->stripImage(); // nettoyage métadonnées 8 $imagick->stripImage(); // nettoyage métadonnées
8 $imagick->setImageFormat($format); 9 //$imagick->setImageFormat($format); // inutile, writeImage force la conversion
9 if($format === 'jpeg'){ 10
10 $imagick->setImageCompression(Imagick::COMPRESSION_JPEG); 11 // compression
11 $imagick->setImageCompressionQuality(85); // optionnel 12 switch($format){
13 case 'jpeg': // particularité du switch, si 'jpeg' le test de 'jpg' est ignoré et on va jusqu'au break
14 case 'jpg':
15 $imagick->setImageCompression(Imagick::COMPRESSION_JPEG);
16 $imagick->setImageCompressionQuality(85);
17 break;
18 case 'webp':
19 $imagick->setImageCompression(Imagick::COMPRESSION_WEBP);
20 $imagick->setImageCompressionQuality(85);
21 break;
22 case 'png':
23 $imagick->setImageCompression(Imagick::COMPRESSION_ZIP);
24 $imagick->setImageCompressionQuality(7); // 9 est sans perte
25 break;
26 case 'tiff':
27 $imagick->setImageCompression(Imagick::COMPRESSION_LZW); // LZW est sans perte
28 break;
12 } 29 }
13 $imagick->writeImage($local_path); // enregistrement 30
31 // enregistrement
32 // writeImage utilise l'extension du fichier et ignore le format détecté
33 // imagemagick est à l'origine une appli console, elle considère que l'extension montre l'intention de l'utilisateur
34 $imagick->writeImage($local_path);
14 $imagick->clear(); 35 $imagick->clear();
15 $imagick->destroy(); 36 $imagick->destroy();
16 return true; 37 return true;
@@ -20,7 +41,7 @@ function imagickCleanImage(string $image_data, string $local_path, string $forma
20 } 41 }
21} 42}
22 43
23function curlDownloadImage(string $url, $maxRetries = 3, $timeout = 10): string|false 44function curlDownloadImage(string $url, int $maxRetries = 3, int $timeout = 10): string|false
24{ 45{
25 $attempt = 0; 46 $attempt = 0;
26 $imageData = false; 47 $imageData = false;
@@ -124,112 +145,75 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'delete_article'){
124 } 145 }
125 die; 146 die;
126} 147}
127elseif(isset($_GET['action']) && $_GET['action'] == 'upload_image'){ 148
128 if(isset($_FILES['file'])){ 149
129 $file = $_FILES['file']; 150elseif(isset($_GET['action']) && in_array($_GET['action'], ['upload_image', 'upload_image_url', 'upload_image_base64'])){
130 $dest = 'images/'; 151 $dest = 'images/';
131 152 if(!is_dir($dest)){
132 if(!is_dir($dest)){ 153 mkdir($dest, 0755, true);
133 mkdir($dest, 0755, true); 154 }
134 } 155 $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'tif'];
135 156
136 $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'tif']; 157 if($_GET['action'] == 'upload_image'){
137 $name = sanitizeFileName(pathinfo($file['name'], PATHINFO_FILENAME)); 158 if(!isset($_FILES['file'])){
138 $extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); 159 http_response_code(400);
139 if(!in_array($extension, $allowed_extensions) || $extension === 'jpg'){ 160 echo json_encode(['message' => 'Erreur 400: Bad Request']);
140 $extension = 'jpeg'; 161 die;
141 }
142 $file_path = $dest . $name . '_' . uniqid() . '.' . $extension;
143
144 if(!is_uploaded_file($file['tmp_name'])) {
145 http_response_code(500);
146 echo json_encode(['message' => "Le fichier n'a pas été téléchargé correctement."]);
147 }
148
149 if(imagickCleanImage(file_get_contents($file['tmp_name']), $file_path, $extension)){ // recréer l’image pour la nettoyer
150 echo json_encode(['location' => $file_path]);
151 } 162 }
152 else{ 163 if(!is_uploaded_file($_FILES['file']['tmp_name'])) {
153 http_response_code(500); 164 http_response_code(500);
154 echo json_encode(['message' => 'Erreur image non valide']); 165 echo json_encode(['message' => "Le fichier n'a pas été téléchargé correctement."]);
166 die;
155 } 167 }
156 }
157 else{
158 http_response_code(400);
159 echo json_encode(['message' => 'Erreur 400: Bad Request']);
160 }
161 die;
162}
163elseif(isset($_GET['action']) && $_GET['action'] == 'upload_image_url'){
164 $json = json_decode(file_get_contents('php://input'), true);
165
166 if(isset($json['image_url'])){
167 $image_data = curlDownloadImage($json['image_url']); // téléchargement de l’image par le serveur avec cURL au lieu de file_get_contents
168 $dest = 'images/';
169 168
170 if(!is_dir($dest)){ 169 $name = sanitizeFileName(pathinfo($_FILES['file']['name'], PATHINFO_FILENAME));
171 mkdir($dest, 0755, true); 170 $extension = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
171 $image_data = file_get_contents($_FILES['file']['tmp_name']);
172 }
173 elseif($_GET['action'] == 'upload_image_url'){
174 $json = json_decode(file_get_contents('php://input'), true);
175 if(!isset($json['image_url'])){
176 http_response_code(400);
177 echo json_encode(['message' => 'Erreur 400: Bad Request']);
178 die;
172 } 179 }
173 180
181 $image_data = curlDownloadImage($json['image_url']); // téléchargement de l’image par le serveur avec cURL au lieu de file_get_contents
174 if($image_data === false){ 182 if($image_data === false){
175 http_response_code(400); 183 http_response_code(400);
176 echo json_encode(['message' => "Erreur, le serveur n'a pas réussi à télécharger l'image."]); 184 echo json_encode(['message' => "Erreur, le serveur n'a pas réussi à télécharger l'image."]);
177 die; 185 die;
178 } 186 }
179 187
180 $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'tif'];
181 $url_path = parse_url($json['image_url'], PHP_URL_PATH); 188 $url_path = parse_url($json['image_url'], PHP_URL_PATH);
182 $name = sanitizeFileName(pathinfo($url_path, PATHINFO_FILENAME)); 189 $name = sanitizeFileName(pathinfo($url_path, PATHINFO_FILENAME));
183 $extension = strtolower(pathinfo($url_path, PATHINFO_EXTENSION)); 190 $extension = strtolower(pathinfo($url_path, PATHINFO_EXTENSION));
184 if(!in_array($extension, $allowed_extensions) || $extension === 'jpg'){ 191 }
185 $extension = 'jpeg'; 192 elseif($_GET['action'] == 'upload_image_base64'){
186 } 193 $json = json_decode(file_get_contents('php://input'), true);
187 $local_path = $dest . $name . '_' . uniqid() . '.' . $extension;
188 194
189 if(imagickCleanImage($image_data, $local_path, $extension)){ // recréer l’image pour la nettoyer 195 // détection de data:image/ et de ;base64, et capture du format dans $type
190 echo json_encode(['location' => $local_path]); 196 if(!isset($json['image_base64']) || !preg_match('/^data:image\/(\w+);base64,/', $json['image_base64'], $type)){ // $type est déclaré et passé par référence
191 } 197 http_response_code(400);
192 else{ 198 echo json_encode(['message' => 'Données image base64 manquantes ou invalides']);
193 http_response_code(500); 199 die;
194 echo json_encode(['message' => 'Erreur image non valide']);
195 } 200 }
196 } 201 $extension = strtolower($type[1]); // dans (\w+)
197 else{
198 echo json_encode(['message' => 'Erreur 400: Bad Request']);
199 }
200 die;
201}
202elseif(isset($_GET['action']) && $_GET['action'] == 'upload_image_base64'){
203 $json = json_decode(file_get_contents('php://input'), true);
204 $dest = 'images/';
205 202
206 if(!is_dir($dest)){ 203 $name = 'pasted_image';
207 mkdir($dest, 0755, true); 204 $image_data = base64_decode(substr($json['image_base64'], strpos($json['image_base64'], ',') + 1)); // découpe la chaine à la virgule puis convertit en binaire
208 } 205 if($image_data === false){
209 206 http_response_code(400);
210 // détection de data:image/ et de ;base64, et capture du format dans $type 207 echo json_encode(['message' => 'Décodage base64 invalide']);
211 if(!isset($json['image_base64']) || !preg_match('/^data:image\/(\w+);base64,/', $json['image_base64'], $type)){ 208 die;
212 http_response_code(400); 209 }
213 echo json_encode(['message' => 'Données image base64 manquantes ou invalides']);
214 die;
215 } 210 }
216 211
217 $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'tif']; 212 if(!in_array($extension, $allowed_extensions)){
218 $extension = strtolower($type[1]);
219 if(!in_array($extension, $allowed_extensions) || $extension === 'jpg'){
220 $extension = 'jpeg'; 213 $extension = 'jpeg';
221 } 214 }
222 215 $local_path = $dest . $name . '_' . uniqid() . '.' . $extension;
223 $image_data = base64_decode(substr($json['image_base64'], strpos($json['image_base64'], ',') + 1)); // découpe la chaine à la virgule puis convertit en binaire 216 if(imagickCleanAndWriteImage($image_data, $local_path)){
224 if($image_data === false){
225 http_response_code(400);
226 echo json_encode(['message' => 'Décodage base64 invalide']);
227 die;
228 }
229
230 $local_path = $dest . 'pasted_image_' . uniqid() . '.' . $extension;
231
232 if(imagickCleanImage($image_data, $local_path)){
233 echo json_encode(['location' => $local_path]); 217 echo json_encode(['location' => $local_path]);
234 } 218 }
235 else{ 219 else{
@@ -238,21 +222,21 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_image_base64'){
238 } 222 }
239 die; 223 die;
240} 224}
225
226
241elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ 227elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){
242 if(isset($_FILES['file'])){ 228 if(isset($_FILES['file'])){
243 $file = $_FILES['file'];
244 $dest = 'media/'; 229 $dest = 'media/';
245
246 if(!is_dir($dest)){ // Vérifier si le répertoire existe, sinon le créer 230 if(!is_dir($dest)){ // Vérifier si le répertoire existe, sinon le créer
247 mkdir($dest, 0755, true); 231 mkdir($dest, 0755, true);
248 } 232 }
249 233
250 $name = sanitizeFileName(pathinfo($file['name'], PATHINFO_FILENAME)); // retirer caractères spéciaux et changer espaces en underscores 234 $name = sanitizeFileName(pathinfo($_FILES['file']['name'], PATHINFO_FILENAME)); // retirer caractères spéciaux et changer espaces en underscores
251 $extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); 235 $extension = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
252 $file_path = $dest . $name . '_' . uniqid() . '.' . $extension; // nom unique 236 $file_path = $dest . $name . '_' . uniqid() . '.' . $extension; // nom unique
253 237
254 if(checkFileDownload($file)){ 238 if(checkFileDownload($_FILES['file'])){
255 if(move_uploaded_file($file['tmp_name'], $file_path)){ 239 if(move_uploaded_file($_FILES['file']['tmp_name'], $file_path)){
256 echo json_encode(['location' => $file_path]); 240 echo json_encode(['location' => $file_path]);
257 } 241 }
258 else{ 242 else{