From 9a1fb624fd1089087bd363551ba64f5862d9919f Mon Sep 17 00:00:00 2001 From: polo Date: Fri, 18 Feb 2022 05:38:40 +0100 Subject: miniatures GD --- config.php | 8 ++++ controller/admin.php | 8 ++-- controller/ckeditor.php | 22 +++++++--- controller/installation.php | 9 ++++- controller/visitor.php | 10 +---- index.php | 24 +++-------- model/Album.php | 21 ++++++---- model/Image.php | 62 +++++++++++++++++++++++++---- view/discographie.php | 6 +-- "\303\240 faire apr\303\250s livraison" | 36 ----------------- "\303\240 faire apr\303\250s livraison.txt" | 47 ++++++++++++++++++++++ "\303\240 faire avant livraison.txt" | 4 +- 12 files changed, 164 insertions(+), 93 deletions(-) create mode 100644 config.php delete mode 100644 "\303\240 faire apr\303\250s livraison" create mode 100644 "\303\240 faire apr\303\250s livraison.txt" diff --git a/config.php b/config.php new file mode 100644 index 0000000..80607e1 --- /dev/null +++ b/config.php @@ -0,0 +1,8 @@ +makeFileList(); - //var_dump($Albums); + // contenu: JSON, HTML, noms et chemins des fichiers $Albums->readAll(); - $Albums->fileList = array_reverse($Albums->fileList); - //var_dump($Albums); + if(!empty($Albums->fileList)) + { + $Albums->fileList = array_reverse($Albums->fileList); + } //var_dump($Albums->fileList); // nouvel album diff --git a/controller/ckeditor.php b/controller/ckeditor.php index 7102f33..5313c3b 100644 --- a/controller/ckeditor.php +++ b/controller/ckeditor.php @@ -89,13 +89,24 @@ function submitCKeditor() $nouveauTitre = Security::secureString($_POST['titre']); $nouvelleAnnee = Security::secureString($_POST['annee']); - $nouvellePochette = $_FILES['upload']['name']; + if(!empty($_FILES['upload']['name'])) + { + $nouvellePochette = $_FILES['upload']['name']; + $nouvellePochetteMini = pathinfo($_FILES['upload']['name'], PATHINFO_FILENAME) . '-mini.' . pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION); + } + else + { + $nouvellePochette = ''; + $nouvellePochetteMini = ''; + } + + //var_dump($nouvellePochetteMini); die(); // enregistrement nouvel album if(!isset($_SESSION['target']) || $_SESSION['target'] == '') { // page disco - $Album->createVignette($nouveauTitre, $nouvelleAnnee, $nouvellePochette); + $Album->createVignette($nouveauTitre, $nouvelleAnnee, $nouvellePochette, $nouvellePochetteMini); // page de l'album if(!empty($_POST['contenu'])) @@ -114,12 +125,13 @@ function submitCKeditor() // garder l'image si aucune n'est sélectionnée // (on ne peut pas préremplir un ) - if($nouvellePochette == '' && $Album->oneAlbum['pochette'] != '') + /*if($nouvellePochette == '' && $Album->oneAlbum['pochette'] != '') { $nouvellePochette = $Album->oneAlbum['pochette']; - } + $nouvellePochetteMini = $Album->oneAlbum['pochetteMini']; + }*/ - $Album->updateVignetteJSON($nouveauTitre, $nouvelleAnnee, $nouvellePochette); + $Album->updateVignetteJSON($nouveauTitre, $nouvelleAnnee, $nouvellePochette, $nouvellePochetteMini); // page de l'album if(isset($_POST['contenu'])) diff --git a/controller/installation.php b/controller/installation.php index 91521e2..9d612dd 100644 --- a/controller/installation.php +++ b/controller/installation.php @@ -24,7 +24,7 @@ function installation() // créer le .htaccess if(!file_exists(".htaccess")) { - echo('

Le .htaccess semble absent ce qui rend le site vulnérable aux attaques, veuillez contacter l\'administrateur.

'); + echo('

Le .htaccess semble absent ce qui rend le site vulnérable, veuillez contacter l\'administrateur.

'); //$contenu = "# redirection en cas d'erreur 404\nErrorDocument 404 http://" . $_SERVER['SERVER_NAME'] . "/" . $nomDuSite . "/erreur404.php\n# Interdire exploration du répertoire\nOptions All -Indexes"; // $fichier = fopen('.htaccess', 'w'); // fputs($fichier, $contenu); @@ -75,12 +75,17 @@ function installation() // chmod('data/' . $page . '/multimedia', 0777); // } } - // dossier supplémentaire dans discographie + // dossiers supplémentaires dans discographie if(!file_exists('data/discographie/json')) { mkdir('data/discographie/json'); chmod('data/discographie/json', $droitsDossiers); } + if(!file_exists('data/discographie/images-mini')) + { + mkdir('data/discographie/images-mini'); + chmod('data/discographie/images-mini', $droitsDossiers); + } // fichier password.txt if(!file_exists('data/password.txt')) { diff --git a/controller/visitor.php b/controller/visitor.php index fccc287..2656798 100644 --- a/controller/visitor.php +++ b/controller/visitor.php @@ -70,7 +70,6 @@ function discoVisitor() //var_dump($Albums->fileList); die(); - // tri des albums avec l'année dans le .json // noms des fichiers JSON @@ -78,20 +77,13 @@ function discoVisitor() //$annees = []; for($i = 0; $i < $Albums->fileListCount; $i++) - { - // une case supplémentaire contient le "fileCode" - //$albumsJSON[$i][3] = pathinfo($albumNamesJSON[$i])['filename']; - //$albumsJSON[$i][3] = pathinfo($Albums->fileList[$i]['fileCode'])['filename']; - - //$annees[$i] = $albumsJSON[$i][1]; - } + {} //var_dump($annee); die(); // tri d'un tableau multidimensionnel //array_multisort($annees, $albumsJSON); - // lien vers le HTML ou ancre? /*$lienAlbum = []; $avecLien = []; diff --git a/index.php b/index.php index 70ca884..5733e8e 100644 --- a/index.php +++ b/index.php @@ -4,14 +4,6 @@ // routeur MVC ou controlleur principal // il traite les GET et passe la main aux contrôleurs - -// sessions, penser aux attaques CSRF (cross-site request forgery): -// ça consite à faire qu'un utilisateur connecté avec une session envoie malgré lui une requête GET ou POST qu'un hacker aura cachée par exemple dans une fausse image clicable -// - solution: faire qu'un GET seul dans une session ne suffise pas à effectuer une action (les GET ne doivent servir qu'à afficher la bonne page), une attaque sur un POST est possible aussi mais plus difficile et nécessite d'injecter du javascript -// - on peut demander à l'utilisateur une vérification supplémentaire avant chaque action, mais c'est plutôt chiant -// - il y a la méthode des jetons, "nonces" et horodatage -// - vérifier le "référent", c'est à dire l'URL de la page d'où vient normallement la requête -// infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery session_start(); if(!empty($_SESSION['erreur'])) @@ -26,6 +18,12 @@ require('controller/installation.php'); require('controller/password.php'); installation(); +// config par défaut +$imageLibrary = 'gd'; // 'gd' ou 'imagick' +$storage = 'files'; // 'files' ou 'database' +// config perso +include('config.php'); + // traitement des requêtes AJAX if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_image') @@ -66,16 +64,6 @@ if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 } submitCKeditor(); - // modification - /*if(isset($_SESSION['target'])) - { - submitCKeditor($_SESSION['target']); - } - // nouvel article - else - { - submitCKeditor(''); // $target = '' - }*/ } else { diff --git a/model/Album.php b/model/Album.php index 386a50f..e716a99 100644 --- a/model/Album.php +++ b/model/Album.php @@ -21,7 +21,7 @@ class Album extends Article // fonctions CRUD // create - public function createVignette($titre, $annee, $pochette) + public function createVignette($titre, $annee, $pochette, $pochetteMini) { //$this->format = 'json'; @@ -33,6 +33,7 @@ class Album extends Article require('model/Image.php'); $Image = new Image(false); $Image->upload(); + $Image->makeThumbnail(); $erreur = $Image->erreur; if(!empty($erreur)) @@ -40,7 +41,7 @@ class Album extends Article } // encodage avec un tableau simple - $albumJSON = json_encode([$titre, $annee, $pochette]); + $albumJSON = json_encode([$titre, $annee, $pochette, $pochetteMini]); //var_dump($albumJSON); die(); // encodage avec un tableau associatif @@ -66,15 +67,13 @@ class Album extends Article for($i = 0; $i < $this->fileListCount; $i++) { // ajout du JSON - /*$content = file_get_contents($this->fileList[$i]['fileName']); - $content = json_decode($content, true);*/ $content = json_decode($this->fileList[$i]['content'], true); - //var_dump($content); die(); // lecture de $content étant un tableau simple $this->fileList[$i]['titre'] = $content[0]; $this->fileList[$i]['annee'] = $content[1]; $this->fileList[$i]['pochette'] = $content[2]; + $this->fileList[$i]['pochetteMini'] = $content[3]; // ajout du HTML si il existe if(file_exists('data/' . $this->page . '/' . $this->format . '/' . $this->fileList[$i]['fileCode'] . '.' . $this->format)) @@ -107,6 +106,7 @@ class Album extends Article $this->oneAlbum['titre'] = $content[0]; $this->oneAlbum['annee'] = $content[1]; $this->oneAlbum['pochette'] = $content[2]; + $this->oneAlbum['pochetteMini'] = $content[3]; // html $this->format = 'html'; @@ -138,14 +138,18 @@ class Album extends Article } // update - public function updateVignetteJSON($titre, $annee, $pochette) + public function updateVignetteJSON($titre, $annee, $pochette, $pochetteMini) { - // garder l'ancienne image + // garder l'image si aucune n'est sélectionnée + // (on ne peut pas préremplir un ) $albumJSON = self::getVignetteJSON(); + /*var_dump($pochette); var_dump($pochetteMini); + var_dump($albumJSON); die();*/ if($pochette == '') { $pochette = $albumJSON[2]; + $pochetteMini = $albumJSON[3]; } else { @@ -153,6 +157,7 @@ class Album extends Article require('model/Image.php'); $Image = new Image(false); $Image->upload(); + $Image->makeThumbnail(); $erreur = $Image->erreur; if(!empty($erreur)) { @@ -161,7 +166,7 @@ class Album extends Article } } - $albumJSON = json_encode([$titre, $annee, $pochette]); + $albumJSON = json_encode([$titre, $annee, $pochette, $pochetteMini]); // écriture $nom_fichier = 'data/discographie/json/' . $this->albumCode . '.json'; diff --git a/model/Image.php b/model/Image.php index 8ebcd16..c305984 100644 --- a/model/Image.php +++ b/model/Image.php @@ -5,7 +5,10 @@ class Image { private const MAX_WEIGHT = 2000000; // à adapter au php.ini private $page; - private $ajax = false; // vaut true avec le ckeditor + private $ajax; // vaut true avec le ckeditor + public $path; + public $pathMini; + public $pathInfos; public $erreur; public function __construct($ajax) @@ -13,14 +16,14 @@ class Image // get envoyé avec le javascript $this->page = $_GET['page']; $this->ajax = $ajax; + $this->path = 'data/' . $this->page . '/images/'; + $this->pathMini = 'data/' . $this->page . '/images-mini/'; } // GET // SET - // miniatures des photos - public function upload() { // traitement et enregistrement de l'image @@ -28,14 +31,14 @@ class Image { if ($_FILES['upload']['size'] <= self::MAX_WEIGHT) { - $infos = pathinfo($_FILES['upload']['name']); - $extension = $infos['extension']; + $this->pathInfos = pathinfo($_FILES['upload']['name']); + $extension = $this->pathInfos['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/' . $this->page . '/images/' . $_FILES['upload']['name']); - chmod('data/' . $this->page . '/images/' . $_FILES['upload']['name'], 0666); + move_uploaded_file($_FILES['upload']['tmp_name'], $this->path . $_FILES['upload']['name']); + chmod($this->path . $_FILES['upload']['name'], 0666); } else{$this->erreur = 'mauvais format, veuillez utiliser une image comportant un de ces formats: jpg ou jpeg, png, gif, bmp, webp, tiff
le format svg n\'est pas supporté';} } @@ -57,4 +60,49 @@ class Image echo $chemin; } } + + // miniatures des photos + public function makeThumbnail() + { + if($imageLibrary == 'gd') + { + // des infos sur GD + //print_r(gd_info()); + + // cette fonction fonctionne pour tous les formats + $source = imagecreatefromstring(file_get_contents($this->path . $_FILES['upload']['name'])); + var_dump($source); + + $nomMiniImage = $this->pathMini . $this->pathInfos['filename'] . '-mini.jpg'; + var_dump($nomMiniImage); + + //var_dump($nomMiniImage); + //var_dump(imagesx($image)); + + $forme = imagesy($source) / imagesx($source); + var_dump($forme); + + if(imagesx($source) > 201) + { + // créer un rectangle noir + $destination = imagecreatetruecolor(201, 201 * $forme); + var_dump($destination); + + // sélectionne un rectangle dans l'image source + // et le place dans un rectangle dans la nouvelle + imagecopyresampled($destination, $source, 0, 0, 0, 0, 201, 201 * $forme, imagesx($source), imagesy($source)); + + // envoie l'image dans un fichier + imagejpeg($destination, $nomMiniImage); + } + else + { + imagejpeg($source, $nomMiniImage); + } + } + elseif($imageLibrary == 'imagick') + {} + else + {} + } } \ No newline at end of file diff --git a/view/discographie.php b/view/discographie.php index 6d56854..f330a8d 100644 --- a/view/discographie.php +++ b/view/discographie.php @@ -51,7 +51,6 @@ ob_start(); fileListCount - 1; $i >= 0; $i--) for($i = 0; $i < $Albums->fileListCount; $i++) -//foreach($albumsJSON as $oneAlbum) { // menu dessous la mouette // comporte un lien si fichier html existe, sinon une ancre @@ -73,8 +72,9 @@ if($_SESSION['admin'] == 1) $style = 'class="articleAvecEditeur"'; ?>
> -

Ajouter un album

+

Ajouter un album

+

+ -
mettre le html à part + Sauvegarde des données !! -- cgit v1.2.3