summaryrefslogtreecommitdiff
path: root/imageAJAX.php
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2021-04-20 21:46:33 +0200
committerpolo <ordipolo@gmx.fr>2021-04-20 21:46:33 +0200
commit87798e5554eb0330cd2de255e5034f0472d410a4 (patch)
treeacd9e26a7d912c7575cb6dd1c7b42cc3e9f52993 /imageAJAX.php
downloadmelaine-87798e5554eb0330cd2de255e5034f0472d410a4.zip
mot de passe
Diffstat (limited to 'imageAJAX.php')
-rw-r--r--imageAJAX.php100
1 files changed, 100 insertions, 0 deletions
diff --git a/imageAJAX.php b/imageAJAX.php
new file mode 100644
index 0000000..49c856d
--- /dev/null
+++ b/imageAJAX.php
@@ -0,0 +1,100 @@
1<?php
2// le problème pour écrire ce fichier est qu'il est impossible d'afficher le contenu des variables avec "echo" ou "var_dump"
3// puisqu'on reste toujours sur la même page, il y a heureusement au moins deux manières de faire autrement:
4// - avec les outils de développement du navigateur (utiliser firefox ou chromium/chrome mais pas les autres)
5// - écrire les données dans un fichier de log
6
7// ce fichier est autonome vis-à-vis du reste du code PHP et sert uniquement à traiter les requêtes AJAX,
8// il reçoit un POST du "simple upload adapter", un plugin du ckeditor qui sert faire de l'AJAX
9// ce POST est une image et s'appelle 'upload', c'est à dire le tableau $_FILES['upload']
10// à la fin on retournera une chaine de caractères avec "echo" et au format json (parce que c'est ce que demande le client)
11
12// avec firefox, faire un clic droit dans la page et cliquer sur examiner l'élément, ou faire Ctrl + Maj + i
13// une fois dans les outils de dev, aller dans la section "Réseau", et ensuite essayer d'uploader un fichier
14// de nombreuses infos sur la dernière requête envoyée apparaissent:
15// fichier = imageAJAX.php
16// initiateur = ckeditor.js
17// état = code HTTP (200 = ok, 400 = erreur dans l'adresse du fichier .php, 500 = erreur interne au serveur)
18// méthode = POST
19// les onglets "En-têtes", "Requête" et "Réponse" donnent d'autres infos:
20// l'onglet "Requête" affiche name="upload",
21// l'onglet "Réponse" montre tout le tableau $_FILES si le PHP comporte l'instruction: $upload = var_dump($_FILES);
22
23// pour que le ckeditor arrête de renvoyer une erreur, j'ai donc dû:
24// - passer du code 500 au code 200, ce qui nécessite d'écrire quelque chose avec "echo", "var_dump", "print_r", etc
25// - et que la chaine écrite avec PHP soit au format json, ce qu'on obtient avec la fonction json_encode'
26
27// nous souhaitons bien sûr enregistrer le fichier et renvoyer une chaine json utilisable par le ckeditor
28// nous devons donc autoriser les bons dossiers en écriture, dont celui des fichiers temporaires du système d'exploitation
29// et renvoyer cette chaîne en json:
30//{
31// "url": "chemin/images/foo.jpg"
32//}
33
34// get envoyé avec le javascript
35$page = $_GET['page'];
36
37// debuggage
38// $_FILES contient:
39//~ $upload = array(
40 //~ 'name' => $_FILES['upload']['name'],
41 //~ 'type' => $_FILES['upload']['type'],
42 //~ 'tmp_name' => $_FILES['upload']['tmp_name'],
43 //~ 'error' => $_FILES['upload']['error'],
44 //~ 'size' => $_FILES['upload']['size']
45//~ );
46// print_r sert à "afficher" un tableau,
47// le 2ème paramètre 'true' permet de produire une simple chaine au lieu d'un affichage HTML
48// $tableau = print_r($_FILES, true);
49// $nom_fichier = "POST_AJAX.log";
50// $fichier = fopen('data/' . $page . '/images/' . $nom_fichier, 'w');
51// // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu
52// fputs($fichier, $tableau);
53// fclose($fichier);
54// chmod('data/' . $page . '/images/' . $nom_fichier, 0666);
55
56
57// déjà fait dans installation.php
58if(!file_exists('data/' . $page . '/images'))
59{
60 mkdir('data/' . $page . '/images', 0777);
61 chmod('data/' . $page . '/images', 0777);
62}
63
64// taille en Mo à adapter au serveur (2Mo est la valeur par défaut dans le php.ini)
65$tailleMax = 2000000;
66$erreur = '';
67
68// traitement et enregistrement de l'image
69if (isset($_FILES['upload']) AND $_FILES['upload']['error'] == 0) // 0 signifie ok
70{
71 if ($_FILES['upload']['size'] <= $tailleMax )
72 {
73 $infos = pathinfo ($_FILES['upload']['name']);
74 $extension = $infos['extension'];
75 $extautorisées = array('jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff');
76 // on prend la même liste que celle côté javascript, le SVG est bloqué pour raison de sécurité (javascript à l'intérieur)
77 if (in_array ($extension, $extautorisées))
78 {
79 move_uploaded_file ($_FILES['upload']['tmp_name'], 'data/' . $page . '/images/' . $_FILES['upload']['name']);
80 chmod('data/' . $page . '/images/' . $_FILES['upload']['name'], 0666);
81 }
82 else{$erreur = 'mauvais format, veuillez utiliser une image comportant un de ces formats: jpg ou jpeg, png, gif, bmp, webp, tiff<br />le format svg n\'est pas supporté';}
83 }
84 else{$erreur = 'fichier trop lourd';}
85}
86else{$erreur = $_FILES['upload']['error'];}
87/* les erreurs retournées avec $_FILES['upload']['error']:
880 pas d'erreur
891 taille du fichier supérieure à la valeur de upload_max_filesize dans le fichier php.ini (par défaut = 2 MO)
902 taille du fichier supérieure à la valeur de MAX_FILE_SIZE dans le formulaire HTML
913 fichier partiellement téléchargé
924 pas de fichier du tout
936 pas de dossier temporaire pour mettre le fichier
947 echec de l'écriture sur le DD
958 envoi arrêté par une extension de PHP mais on ne nous dit pas pourquoi => diagnostic avec la fonction phpinfo() */
96
97// nouveau chemin à renvoyer en format json
98$chemin = '{"url": "data/' . $page . '/images/' . $_FILES['upload']['name'] . '"}';
99//echo json_encode($chemin);
100echo $chemin;