-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupdateGallery.php
133 lines (120 loc) · 5.51 KB
/
updateGallery.php
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php
session_start();
require_once('./libs/utils.php');
require_once('./libs/config.php');
require_once('./src/models/Gallery.php');
require_once('./src/models/GalleryManager.php');
$errors = [];
$messages = [];
// Rendre la page 'admin.php' inaccessible si l'utilisateur n'est pas connecté OU si connecté en tant que 'client'
if (is_admin() == false) {
header('location: ./index.php');
}
// Les types MIME autorisés sont stockés dans une variable
$authorizedMimeTypes = [
'png' => 'image/png',
'jpg' => 'image/jpg',
'webp' => 'image/webp',
];
function isUploadSuccessful(array $uploadedFile): bool
{
return isset($uploadedFile['error']) && $uploadedFile['error'] === UPLOAD_ERR_OK;
}
function isUploadSmallerThan2M(array $uploadedFile): bool
{
return $uploadedFile['size'] < 2000000;
}
function isMimeTypeAuthorized(array $authorizedMimeTypes, array $uploadedFile): bool
{
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($uploadedFile['tmp_name']);
return in_array($mimeType, $authorizedMimeTypes, true);
}
function getExtensionFromMimeType(array $authorizedMimeTypes, array $uploadedFile): string
{
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($uploadedFile['tmp_name']);
if ($extension = array_search($mimeType, $authorizedMimeTypes, true)) {
return $extension;
}
throw new RuntimeException('Le type MIME n\'est lié à aucune extension');
}
function moveUploadedFile(array $uploadedFile, string $uniqFilename): bool
{
return move_uploaded_file($uploadedFile['tmp_name'], _GALLERY_IMG_PATH_ . $uniqFilename);
}
if (isset($_GET['id']) && !empty($_GET['id'])) {
// "Nettoyage" l'Id envoyé
$id = strip_tags($_GET['id']);
$manager = new GalleryManager();
$gallery = $manager->readGalleryById($id);
// Je récupère l'ancien nom de fichier en vue de sa suppression sur le serveur
$oldFilename = $gallery->getFile();
// On fait d'abord les vérifications avant d'envoyer les modifications
if ($_POST) {
try {
$filename = $_POST['filename'] ?? null;
$uploadedFile = $_FILES['uploaded_file'] ?? [];
// Vérification du bon téléchargement et bon format de fichier
if (!isUploadSuccessful($uploadedFile)) {
throw new RuntimeException('Le téléchargement a échoué : aucun fichier sélectionné');
}
if (!isMimeTypeAuthorized($authorizedMimeTypes, $uploadedFile)) {
throw new RuntimeException('Le type de fichier n\'est pas supporté');
}
// Vérification taille fichier < 2Mo
if (!isUploadSmallerThan2M($uploadedFile)) {
throw new RuntimeException('Le fichier dépasse les 2 Mo');
}
// Vérifier que le nom de l'image du formulaire ne contient que des caractères autorisés
if (!preg_match('/^[\w~]+$/', $filename)) {
// PROBLEME : n'accepte pas les TIRETS ???!!!! //
throw new RuntimeException('Le nom de l\'image ne doit pas être vide et ne contenir que des lettres, chiffres, ou des underscores');
}
// Vérifier que le champs 'Description' est rempli et non nul
if (!isset($_POST['description']) || empty($_POST['description'])) {
throw new RuntimeException('Le champs Description n\'est pas rempli');
}
// Vérifications OK, on peut démarrer le téléchargement vers le dossier '/upload' du serveur
$extension = getExtensionFromMimeType($authorizedMimeTypes, $uploadedFile);
// uniqid() : génère un identifiant basé sur la date et heure courante en microsecondes.
// Utile pour éviter l'écrasement de fichier si le même nom de fichier de photo est utilisé plusieurs fois.
$uniqFilename = uniqid() . '-' . slugify($filename) . '.' . $extension;
if (!moveUploadedFile($uploadedFile, $uniqFilename)) {
throw new RuntimeException('Le téléchargement a échoué ...');
}
$messages[] = 'Votre fichier a bien été téléchargée';
} catch (RuntimeException $e) {
$errors[] = $e->getMessage();
}
if (!$errors) {
// Sauvegarde dans la BDD du chemin vers cette image (qui est stockée physiquement sur le serveur)
// On nettoie le champs 'Description' envoyées
$description = strip_tags($_POST['description']);
$manager = new GalleryManager();
// traitement des données du formulaire
$newGallery = new Gallery();
$newGallery->setId($id);
$newGallery->setName($filename);
$newGallery->setDescription($description);
$newGallery->setFile($uniqFilename);
$check = $manager->updateGallery($newGallery);
if ($check) {
// Message de confirmation
$messages[] = 'Votre Galerie contient bien votre nouvelle image';
} else {
$errors[] = 'Votre image n\'a pas pu être sauvegardée';
}
// Effacement de l'ancien fichier sur le serveur (voir utils.php)
deleteFileFromUpload($oldFilename);
if (is_dir($oldFilename)) {
// Message d'erreur
$errors[] = 'L\'ancien fichier n\'a pas pu être effacé sur le serveur';
}
}
}
} else {
// URL invalide
header('location: ./404.php');
}
require_once('./templates/gallery/updateGallery.php');