Partage
  • Partager sur Facebook
  • Partager sur Twitter

Classement des images téléchargées

    7 avril 2023 à 17:11:26

    Bonjour,

    Je vous explique mon "problème" : je développe un site sur lequel les utilisateurs, qui se connectent avec identifiant, mdp et session, peuvent enregistrer un évènement à une date donnée, et dans lequel il y a un champ pour y mettre du texte, des images (téléchargées sur le serveur), des liens, etc., et ce, à l'aide de TINYMCE.

    J'ai 2 questions, liées : pour les noms de fichiers je les renomme et leurs donnent un nom de fichier unique (genre uniqueid()), ça à l'air ok, mais ce que je voudrais c'est également les placer dans un répertoire, unique, et lié à l'évènement, dans le but de pouvoir ultérieurement supprimer les évènements passés et les images correspondantes afin de ne pas conserver celles-ci éternellement l'évènement supprimé.

    Et c'est là que ça se complique (pour moi..) : je pourrais prendre l'ID de l'évènement comme répertoire mais le soucis c'est qu'en création je n'ai pas encore l'ID car il est créer au moment de l'INSERT en BDD, auriez vous une solution ?

     Et autre soucis c'est qu'avec TINYMCE je ne sais pas paramétrer le répertoire car il en "dur" dans le fichier "postAcceptor.php"  et tous mes essais de modification ne fonctionnent pas.

     Merci d'avance pour votre aide.

    -
    Edité par JeanAimarre11 7 avril 2023 à 17:12:35

    • Partager sur Facebook
    • Partager sur Twitter
      10 avril 2023 à 12:04:52

      Bonjour

      Creer un repertoire pour chaque evenement, c'est pas la meilleure idee(pour moi). Chaque evenemt a une image, et chaque image, avant meme l'insertion en base de donnees devrait etre deja "uploadee" sur le serveur.

      Maintenant tu dis vouloir faire cela pour facilement faire la suppression, mais cette suppression ne devrait-elle pas se faire via le site ? Et non "directement". Pour supprimer un fichier lorsque tu as le chemin tu peux utiliser unlink.

      Tu precises aussi que tu peux creer des repertoires "automatiquement" avec tinymce. Vu que c'est en php, tu peux definir le repertoir dynamiquement.

      <?php
      
      $uploadDir = "/chemin/vers/evenements/" . date_create()->format('Y/m');
      • Partager sur Facebook
      • Partager sur Twitter
        10 avril 2023 à 18:48:27

        Bonjour Asmitta,

        Merci pour ta réponse, je me sentais un peu seul.. lol

        Effectivement ta solution "serait" bonne mais le truc c'est que dans un évènement il peut y avoir 'n' images (2, 3, 100...) et tout cela est écrit dans un seul champ (un 'textarea' géré par TINYMCE). Donc quand l'évènement sera supprimé il faudra également supprimer les 'n' images.

        Concernant les évènements ils sont créer à une date donnée, et passée cette date, ils n'on plus lieu d'être (comme les rdv dans un agenda), et l'utilisateur qui l'a créer ne va pas revenir le supprimer, il s'en fout (...), donc j'ai prévu une moulinette pour supprimer les évènements inferieurs à une certaine date et toutes leurs images associées. C'est pour cela que j'ai imaginé un répertoire par évènement, et que le nom de ce répertoire soit stocké dans l'évènement.

        Tu dis "définir le répertoire dynamiquement, c'est du PHP".. là on est dans TINYME, et dans le fichier "postAcceptor.php" et là pour moi on est dans la 4° dimension !!! si j'ai compris il s'exécute sur le serveur et ne connait pas les variables, les variables _SESSION, les _POST..

        Mais aujourd'hui, le passage des cloches m'ayant boosté, j'ai, je crois, solutionné mon problème:

        Sur la page de création de l'évènement :

        - Avant toute saisie je fait un insert dans une table X avec un ID auto-incrémenté (il sera donc unique) et je récupère son numéro avec 'mysqli_insert_id', j'ai donc mon répertoire (préfixé avec le répertoire upload) par exemple "/upload/210/"

        - J'ai quand même réussi à 'dialoguer' avec "postAcceptor.php" : dans tinymce.init() je met "images_upload_url: '/postAcceptor.php?TINY_ZZ=$idev'," où la variable $idev contient mon répertoire et je récupère ça dans "postAcceptor.php" par un "$_GET['TINY_ZZ']" (c'est la seule chose qu'il accepte je pense)

        - Les images sont téléchargées dans le répertoire paramétrée et le nom de fichier obtenu par "'RM_'.md5(session_id().microtime(),FALSE)"(par exemple"/upload/210/RM_7bd6b1089f12bf2e9bc867e377818e13.jpg"

        - Et lors de insertion en base de données de l'évènement je stocke le répertoire également ("/upload/210/") et je pourrait ainsi l'utiliser lors de la suppression de l'évènement, je ferais la suppression de tous les fichiers du répertoire.

        Voilà ce que j'ai trouvé, je ne sais pas s'il y a de meilleures solutions, je reste preneur.

        -
        Edité par JeanAimarre11 10 avril 2023 à 18:50:41

        • Partager sur Facebook
        • Partager sur Twitter
          11 avril 2023 à 10:03:10

          j'aurai pas fait comme ca, pas que c'est mauvais mais j'ai deja une habitude...

          Et vu que tu as deja un code tout bon pour supprimer un evenement et ses images via l'id tant mieux, ta solution semble adequate pour ton probleme. Marque ton sujet comme etant resolu donc.

          Mais j'aimerai savoir comment tu supprimes un evenement et ses images. Tu fouilles juste le dossier et tu supprimes ? J'espere que non.

          • Partager sur Facebook
          • Partager sur Twitter
            11 avril 2023 à 12:34:06

            Si tu as une autre façons de faire je suis preneur, d'autant plus qu'hier j'ai voulu mettre ça sur mon mutualisé OVH (jusqu'à là j'etais sur WAMP) et ça ne fonctionne plus... grrrr

            Pour supprimer les évènements je n'ai pas encore fait, mais j'envisage de parcourir ma table des événements, et pour ceux qui sont à supprimer je récupère le répertoire des images que j'avais stocké (par exemple "/upload/210/" et je supprime donc ce répertoire. 

            • Partager sur Facebook
            • Partager sur Twitter
              12 avril 2023 à 15:34:33

              La suppression ne devrait pas se faire directement. Il est preferable de creer une page sur ton site qui va permettre de le faire. C'est pour cela que j'ai parlé de unlink de php.

              Chaque evenement devrait avoir une classe(Event par exemple). Et puisque chaque evenement a des images, la classe Event doit donc avoir un champ "images" par exemple. Ce champ contenant un tableau de chaine de caracteres(chemin de l'image). Pour la suppression tu crées une fonction qui va retirer ce que tu souhaites en base de donnees(DELETE) et tu fais appel a unlink() pour supprimer les images sur le disque.

              • Partager sur Facebook
              • Partager sur Twitter
                12 avril 2023 à 17:49:23

                Oui ok je vois, c'est une bonne solution, sauf que pour le moment je ne sais pas mettre le chemin des images dans un tableau de chaine de caractères... car dans TINYMCE tu peux télécharger des images, mais si tu la supprime dans l'éditeur elle reste sur le disque, et puis on peut 'coller' des images et c'est transformé en fichier sur disque, également mettre des liens vers des images externes, donc un gros 'bordel' à gérer ça, il faut intercepter tout ce que fait l'éditeur, c'est bien au dessus de mes modestes compétences.
                Encore merci pour ton aide.
                PS : par curiosité j'ai jeté un œil ici, à l'endroit où on répond aux messages, et c'est tout à fait mon sujet, on peut mettre des images, je pense que c'est TINYMCE aussi, et j'ai testé,  tu télécharges une image et si tu abandonnes l'opération l'image reste sur le serveur.
                • Partager sur Facebook
                • Partager sur Twitter
                  12 avril 2023 à 18:30:33

                  Lis ceci: PHP image upload handler | TinyMCE Documentation

                  Tu peux donc recuperer le chemin des images.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 avril 2023 à 23:19:56

                    J'utilise ce script, mais je ne saurais pas faire la récupération des chemins.
                    Et maintenant je pense à une chose, je comptais supprimer les fichiers lors de la suppression de l'évènement mais ça ne va pas: quand on arrive sur le formulaire, et sur le champ "textarea" géré par TINYMCE on peur télécharger des images qui sont stockées sur le serveur, et, et c'est là le problème, on peut abandonner sans valider le formulaire et donc sans créer l'évènement, et les fichiers restent sur le serveur  !! 

                    Je vais donc faire le contraire, je vais vérifier pour chaque fichier (en fait pour chaque répertoire) qu'il existe un évènement, et dans la cas contraire je supprime les fichiers.

                    Je serais curieux de savoir comment ils traitent ça ici sur le site....

                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 avril 2023 à 11:55:23

                      On retrouve cette ligne dans le postAcceptor.php

                          echo json_encode(array('location' => $baseurl . $filetowrite));
                      

                      Vu ce qui precede cette ligne et les commentaires aussi le chemin final d'une image uploadée sur le serveur est `$baseurl . $filetowrite`. Si tu veux donc "retenir" ce chemin tu peux ecrire

                      // Si tu as l'id de ton evenement dans la variable $id_event par exemple
                      error_log([
                          'id' => $id_event,
                          'img_path' => $baseurl . $filetowrite
                        ],
                        3,
                        '/un/fichier/de/logs'
                      );
                      
                      echo json_encode(array('location' => $baseurl . $filetowrite));
                      

                      error_log c'est pour ecrire dans un fichier mais tu peux bien ecrire en base de donnees ou faire n'importe quel autre action si necessaire. Juste pour te montre comment avoir le chemin de ton image sur le disque.

                      Une fois que tu as reussi a lier chaque image sur le disque a leurs evenements respectifs tu peux creer une fonction(tache cron) qui va parcourir le repertoires des images et supprimer toutes celle qui ne sont associees a aucun evenement.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 avril 2023 à 2:17:09

                        il y a 2 cas de figure :

                        A) L'utilisateur est sur le formulaire, télécharge 2 images (image1 & image2) et abandonne l'opération, aucun évènement n'est crée, il y a 2 fichiers  inutiles sur le disque

                        B) L'utilisateur est sur le formulaire, télécharge 2 images (image1 & image2), changes d'avis et supprime l'image1 dans l'éditeur, et valide l'opération, un  évènement est crée, il y a 2 fichiers sur le disque, l'image1 est inutile.

                        Ta solution est efficace pour le cas A, les 2 fichiers sont supprimés, reste à voir le temps d'exécution de la tâche cron, car supposons 100 000 images et 100 000 événements à parcourir pour chaque image ça peut etre long je pense.

                        Pour le cas B à moins d'aller "fouiller" dans le champ où est stocké le 'textarea' je ne vois pas de solution jusqu'à la suppression de l'évènement.

                        J'ai fait quand même le error_log() que tu as indiqué, ça peut être utile. Je ne connaissait par cette fonction et c'est bien pratique, sinon je partais sur un fopen() un peu plus compliqué.

                        Merci encore pour ton aide, je suis content car tout fonctionne sur mon mutualisé OVH maintenant.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Classement des images téléchargées

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown