summaryrefslogtreecommitdiff
path: root/imageAJAX.php
blob: 0831986322552332aee3ae313f2e881456cd88de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?php
// imageAJAX.php
//
// le problème pour écrire ce fichier est qu'il est impossible d'afficher le contenu des variables avec "echo" ou "var_dump"
// puisqu'on reste toujours sur la même page, il y a heureusement au moins deux manières de faire autrement:
// - avec les outils de développement du navigateur (utiliser firefox ou chromium/chrome mais pas les autres)
// - écrire les données dans un fichier de log

// ce fichier est autonome vis-à-vis du reste du code PHP et sert uniquement à traiter les requêtes AJAX,
// il reçoit un POST du "simple upload adapter", un plugin du ckeditor qui sert faire de l'AJAX
// ce POST est une image et s'appelle 'upload', c'est à dire le tableau $_FILES['upload']
// à la fin on retournera une chaine de caractères avec "echo" et au format json (parce que c'est ce que demande le client)

// avec firefox, faire un clic droit dans la page et cliquer sur examiner l'élément, ou faire Ctrl + Maj + i
// une fois dans les outils de dev, aller dans la section "Réseau", et ensuite essayer d'uploader un fichier
// de nombreuses infos sur la dernière requête envoyée apparaissent:
// fichier = imageAJAX.php
// initiateur = ckeditor.js
// état = code HTTP (200 = ok, 400 = erreur dans l'adresse du fichier .php,  500 = erreur interne au serveur)
// méthode = POST
// les onglets "En-têtes", "Requête" et "Réponse" donnent d'autres infos:
// l'onglet "Requête" affiche name="upload",
// l'onglet "Réponse" montre tout le tableau $_FILES si le PHP comporte l'instruction: $upload = var_dump($_FILES);

// pour que le ckeditor arrête de renvoyer une erreur, j'ai donc dû:
// - passer du code 500 au code 200, ce qui nécessite d'écrire quelque chose avec "echo", "var_dump", "print_r", etc
// - et que la chaine écrite avec PHP soit au format json, ce qu'on obtient avec la fonction json_encode'

// nous souhaitons bien sûr enregistrer le fichier et renvoyer une chaine json utilisable par le ckeditor
// nous devons donc autoriser les bons dossiers en écriture, dont celui des fichiers temporaires du système d'exploitation
// et renvoyer cette chaîne en json:
//{
//    "url": "chemin/images/foo.jpg"
//}

// debuggage
/*print_r($_FILES);
$upload = array(
    'name' => $_FILES['upload']['name'],
    'type' => $_FILES['upload']['type'],
    'tmp_name' => $_FILES['upload']['tmp_name'],
    'error' => $_FILES['upload']['error'],
    'size' => $_FILES['upload']['size']
);
print_r($upload);*/

session_start();
// et une backdoor de fermée!
if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1 || !isset($_FILES['upload']) || empty($_FILES['upload']))
{
    header('Location: index.php?erreur=imageajax');
}

// get envoyé avec le javascript
$page = $_GET['page'];

// déjà fait dans installation.php
if(!file_exists('data/' . $page . '/images'))
{
    mkdir('data/' . $page . '/images', 0777);
    chmod('data/' . $page . '/images', 0777);
}

// taille en Mo à adapter au serveur (2Mo est la valeur par défaut dans le php.ini)
$tailleMax = 2000000; 
$erreur = '';

// traitement et enregistrement de l'image
if (isset($_FILES['upload']) AND $_FILES['upload']['error'] == 0) // 0 signifie ok
{
    if ($_FILES['upload']['size'] <= $tailleMax )
    {
        $infos = pathinfo ($_FILES['upload']['name']);
        $extension = $infos['extension'];
        $extautorisées = array('jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff');
        // on prend la même liste que celle côté javascript, le SVG est bloqué pour raison de sécurité (javascript à l'intérieur)
        if (in_array ($extension, $extautorisées))
        {
            move_uploaded_file ($_FILES['upload']['tmp_name'], 'data/' . $page . '/images/' . $_FILES['upload']['name']);
            chmod('data/' . $page . '/images/' . $_FILES['upload']['name'], 0666);
        }
        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é';}
    }
    else{$erreur = 'fichier trop lourd';}
}
else{$erreur = $_FILES['upload']['error'];}
/* les erreurs retournées avec $_FILES['upload']['error']:
0 pas d'erreur
1 taille du fichier supérieure à la valeur de upload_max_filesize dans le fichier php.ini (par défaut = 2 MO)
2 taille du fichier supérieure à la valeur de MAX_FILE_SIZE dans le formulaire HTML
3 fichier partiellement téléchargé
4 pas de fichier du tout
6 pas de dossier temporaire pour mettre le fichier
7 echec de l'écriture sur le DD
8 envoi arrêté par une extension de PHP mais on ne nous dit pas pourquoi => diagnostic avec la fonction phpinfo() */

// nouveau chemin à renvoyer en format json
$chemin = '{"url": "data/' . $page . '/images/' . $_FILES['upload']['name'] . '"}';
//echo json_encode($chemin);
echo $chemin;