diff options
author | polo <ordipolo@gmx.fr> | 2025-06-19 18:11:20 +0200 |
---|---|---|
committer | polo <ordipolo@gmx.fr> | 2025-06-19 18:11:20 +0200 |
commit | 8cf5ac1abf9e2a6134cb82d4582aecaa99b1331a (patch) | |
tree | 24b69c10b8a553c96323542153bd7e4597a6e049 /src | |
parent | b61c918e05124ddb0bb3102a626ca913a0ab4f3a (diff) | |
download | cms-8cf5ac1abf9e2a6134cb82d4582aecaa99b1331a.zip |
upload image éditeur: téléchargement automatique d'images base64 non encapsulées dans du HTML
Diffstat (limited to 'src')
-rw-r--r-- | src/controller/ajax.php | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/controller/ajax.php b/src/controller/ajax.php index 6813d45..a462921 100644 --- a/src/controller/ajax.php +++ b/src/controller/ajax.php | |||
@@ -142,7 +142,46 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_image_url'){ | |||
142 | } | 142 | } |
143 | die; | 143 | die; |
144 | } | 144 | } |
145 | // cas du collage d'une image (code base64) non encapsulée dans du HTML | ||
146 | elseif(isset($_GET['action']) && $_GET['action'] == 'upload_image_base64'){ | ||
147 | $json = json_decode(file_get_contents('php://input'), true); | ||
148 | $dest = 'images/'; | ||
149 | |||
150 | if(!is_dir('images')){ | ||
151 | mkdir('images', 0777, true); | ||
152 | } | ||
145 | 153 | ||
154 | // détection de data:image/ et de ;base64, et capture du format dans $type | ||
155 | if(!isset($json['image_base64']) || !preg_match('/^data:image\/(\w+);base64,/', $json['image_base64'], $type)){ | ||
156 | http_response_code(400); | ||
157 | echo json_encode(['message' => 'Données image base64 manquantes ou invalides']); | ||
158 | die; | ||
159 | } | ||
160 | |||
161 | $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'tif']; | ||
162 | $extension = strtolower($type[1]); | ||
163 | if(!in_array($extension, $allowed_extensions) || $extension === 'jpg'){ | ||
164 | $extension = 'jpeg'; | ||
165 | } | ||
166 | |||
167 | $image_data = base64_decode(substr($json['image_base64'], strpos($json['image_base64'], ',') + 1)); // découpe la chaine à la virgule puis convertit en binaire | ||
168 | if($image_data === false){ | ||
169 | http_response_code(400); | ||
170 | echo json_encode(['message' => 'Décodage base64 invalide']); | ||
171 | die; | ||
172 | } | ||
173 | |||
174 | $local_path = $dest . 'pasted_image_' . uniqid() . '.' . $extension; | ||
175 | |||
176 | if(imagickCleanImage($image_data, $local_path)){ | ||
177 | echo json_encode(['location' => $local_path]); | ||
178 | } | ||
179 | else{ | ||
180 | http_response_code(500); | ||
181 | echo json_encode(['message' => 'Erreur image non valide']); | ||
182 | } | ||
183 | die; | ||
184 | } | ||
146 | 185 | ||
147 | // détection des requêtes de type XHR, y en a pas à priori | 186 | // détection des requêtes de type XHR, y en a pas à priori |
148 | /*elseif(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){ | 187 | /*elseif(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){ |