Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer et encoder des images longblob avec php

Sujet résolu
    9 septembre 2021 à 23:37:17

    Bonjour à tous,

    Voilà des heures et des heures que je me casse la tête sur mon problème. J'aimerais vous prévenir que je suis assez débutant, mais je pense que ça va se voir.

    J'ai une BDD dans laquelle j'ai stocké des images en longblob (des formats gif qui font entre 15 et 20 ko)

    Mon but : les récupérer avec la colonne indexée, les encoder en base64 puis les formater en json pour un export sous unity (c#)

    Je fais déjà ça avec mes données et ça marche très bien. C'est la première fois que j'utilise des images... et ça se passe pas pareil dirait-on ^^

    Voici un code typique avec des données et qui marche très bien :

    $request = $conn->prepare("SELECT Dribble FROM Player");
    $request->execute();
    
    $rows = array();
            while ($row = $request->fetch(PDO::FETCH_ASSOC)) {
            $rows[] = $row;
            }
            echo json_encode($rows);



    Voici la variante avec les images qui ne marche pas du tout... :

    $request = $conn->prepare("SELECT Miniature FROM Player");
    $request->execute();
    
    $rows = array();
            while ($row = $request->fetch(PDO::FETCH_ASSOC)) {
            $rows[] = base64_encode($row['Miniature']);
            }
            echo json_encode($rows);



    J'ai testé beaucoup de chose mais mes connaissances très limitées dans le php font que je test surtout n'importe quoi.

    Merci pour toute l'aide que vous pourrez m'apporter !

    -
    Edité par YannLOTTON 9 septembre 2021 à 23:40:39

    • Partager sur Facebook
    • Partager sur Twitter
    C'est lorsqu'on arrête d'apprendre que l'on commence à vieillir
      10 septembre 2021 à 1:25:23

      Tu veux dire que dans ta BDD tu as les GIF ? Donc, que ces GIF sont stockés dans leur répertoire sur ton support de stockage (SSD ou HDD) ET que ces GIF sont stockés dans ta BDD ? Soit doublon de stockage si c'est le cas.

      Je ne sais pas quelle utilisation tu veux faire des GIF, mais, tu devrais les stocker dans ton support de stockage dans un répertoire racine de ton projet que tu nomme comme tu veux. Et dans ta BDD, tu ne stockes pas les GIF mais le chemin depuis le répertoire racine.

      Quand tu feras ta requête, tu pourras stocker le chemin du GIF de type chaîne de caractères, et le manipuler comme on manipule un fichier.

      Je me trompe peut-être mais comme JSON est un langage de format de données, il ne sert basiquement qu'au stockage donc, j'ai du mal à trouver de l'intérêt à encoder les images, et de plus, ça ferait doublon avec ta BDD qui stocke des données.

      • Partager sur Facebook
      • Partager sur Twitter
        10 septembre 2021 à 8:52:01

        Les gif ne sont pas stockés sur un support, uniquement sur ma base de données. J'ai bien pensé à stocker sur mon espace en ligne et ne conserver que les chemins, mais j'ai besoin de récupérer toutes les images d'un coup sur mon appli et ça va faire énormément de requête internet (j'aurais environ 300 images à récupérer au lancement de l'appli). Je ne peux pas les stocker non plus dans l'appli car j'en ai des nouvelles toutes les semaines et ça m'obligerai à faire des maj de mon appli en permanence.

        Le json me permet de traiter facilement les données depuis le C#. Avec un script d'interprétation je peux transformer mon tableau de base de données "Joueurs" qui est stocké dans une variable de type text, en objet. Par exemple dans mon tableau joueurs j'ai une colonne dribble, donc depuis mon script c# je fais joueur[n].dribble et j'accède à la donnée.

        Encoder les longblob en base64 c'est la solution que j'ai trouvé pour récupérer et stocker facilement les images dans une variable, sachant que l'appli peut ensuite les décoder et les utiliser à loisir. Après je suis peut-être en train de faire une connerie...

        • Partager sur Facebook
        • Partager sur Twitter
        C'est lorsqu'on arrête d'apprendre que l'on commence à vieillir
          10 septembre 2021 à 10:08:13

          Bonjour,

          Comment insères-tu les données binaires en base ? (encodage, charset, etc.) le code ?

          Que récupères-tu côté PHP (var_dump) ?

          Ne devrais-tu pas faire le base64_encode côté Unity pour laisser le binaire "brut" dans le JSON ?

          Si côté PHP tu essayes simplement d'afficher l'image dans une balise HTML <img> ?

          Et quel est le problème au final ? Dans ton app Unity l'image ne s'affiche pas du tout ? Ou mal ? Une erreur ?

          -
          Edité par Benzouye 10 septembre 2021 à 10:10:15

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            10 septembre 2021 à 10:37:08

            Hello !

            En base j'insère directement l'image dans la BDD via phpMyAdmin, j'espère que je réponds à la question ^^

            Si je peux mettre en brut dans le json ça me va aussi mais je ne récupère que "null" quand j'encode pas via le php...

            Je ne connais pas du tout l'html. Ce serait pour essayer voir si je récupère bien l'image ?

            Le problème est que je n'arrive pas du tout à récupérer le code de l'image ET à formater le tout en json derrière. Je n'ai pas le loisir de me prendre la tête avec unity pour le moment...

            En fait voilà ce que j'aimerais récupérer :

            [{"Miniature":"Code de l'image"},{"Miniature":"Code de l'image"},{"Miniature":"Code de l'image"},{"Miniature":"Code de l'image"},etc,]

            Au mieux je récupère un truc comme ça :

            ["R0lGODlhgACAAPcAAAICAgsBAgcHCRUJBgoUBxYUCQgIFBYLFQkUFRgWFiQXFysQCxkkFSckGDEnEwkSLSkbJg8nLyklJTYoJzQzME8NDnEIFEwtDHMUJkY3N...

            En plus j'ai l'impression que la longueur de la chaine de caractère va dépasser la limite, est-ce possible ?


            -
            Edité par YannLOTTON 10 septembre 2021 à 11:34:51

            • Partager sur Facebook
            • Partager sur Twitter
            C'est lorsqu'on arrête d'apprendre que l'on commence à vieillir
              10 septembre 2021 à 12:15:40

              ce que tu récupères me semble être le code de l'image

              Edit: un site pour codage/décodage base64 vers image (et inversement) > https://base64.guru/ 

              -
              Edité par umfred 10 septembre 2021 à 12:33:39

              • Partager sur Facebook
              • Partager sur Twitter
                10 septembre 2021 à 12:29:39

                Il semble oui, sauf que je n'ai pas l'indexation des colonnes et le formatage json semble incomplet et donc inutilisable par mon script c# :(
                • Partager sur Facebook
                • Partager sur Twitter
                C'est lorsqu'on arrête d'apprendre que l'on commence à vieillir
                  10 septembre 2021 à 12:56:30

                  le problème de tes boucles php c'est qu'à la fin, tu n'aura que la dernière image (vu que tu écrases à chaque tour ton tableau)

                  $request = $conn->prepare("SELECT Miniature FROM Player");
                  $request->execute();
                   
                  $rows = array();
                  $i=0;
                  while ($row = $request->fetch(PDO::FETCH_ASSOC)) {
                      $rows[i] = array("Miniature" => base64_encode($row['Miniature']);
                      $i+=1;
                      }
                  echo json_encode($rows);

                  doit te retourner ce que tu veux.
                  Quand tu parles d'indexation des colonnes tu veux dire quoi ? si c'est l'id de ton enregistrement en base, il faut rajouter la colonne dans ton select (alternativement, tu peux utiliser ma variable $i)

                  Edit: du coup, ça semple plus être un problème PHP que BDD, non ? Et sinon, pourquoi ne pas récupérer tes images via c# si tu veux les importer (et pas exporter ^^) ? 

                  -
                  Edité par umfred 10 septembre 2021 à 12:59:22

                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 septembre 2021 à 14:50:42

                    Oh nice, merci pour le site de conversion. Je n'avais même pas pensé à ça ^^'  Bon du coup le code de l'image est mauvais, c'est bien ce que je craignais. Il ne doit pas m'encoder que l'image...

                    L'indexation c'est le nom de ma colonne devant chaque code (Miniature dans mon cas). Comme sur l'exemple que j'ai envoyé.

                    J'ai effectivement vu des personnes qui faisaient des requêtes SQL directement depuis Unity. Il me semble que c'est pour une question de sécurité que je passe par du php. J'avoue que je ne sais plus très bien j'ai pris l'habitude de faire comme ça, je ne pose plus la question. Mais peut-être est-ce la solution...

                    Merci pour le bout de code et les pistes, je vais creuser tout ça !

                    • Partager sur Facebook
                    • Partager sur Twitter
                    C'est lorsqu'on arrête d'apprendre que l'on commence à vieillir
                      10 septembre 2021 à 15:14:21

                      Après pour le décodage du fichier en base, il faut faire l'opération inverse de celle que tu as faite lors du codage (si réversible)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 septembre 2021 à 17:44:52

                        Bon, avec ce code :

                        $request = $conn->prepare("SELECT Miniature FROM Player");
                        $request->execute();
                        
                        $rows = array();
                        $i=0;
                        while ($row = $request->fetch(PDO::FETCH_ASSOC)) {
                            $rows[i] = base64_encode($row['Miniature']);
                            echo "".$rows[i]."\n";
                            $i+=1;
                        }

                        J'ai la liste des codes les uns à la suite des autres dans une variable text sous Unity. Codes qui marchent si je les colle dans le site que tu m'a donné.

                        Ils commencent tous par la même chaine de caractères donc je devrais pouvoir les décoller facilement. J'imagine que la partie php/sql est donc réglée pour le moment, même si j'ai pas le formatage que je voulais.

                        Merci beaucoup pour ton aide ! J'irais embêter le forum c# maintenant si j'ai des soucis :)

                        • Partager sur Facebook
                        • Partager sur Twitter
                        C'est lorsqu'on arrête d'apprendre que l'on commence à vieillir

                        Récupérer et encoder des images longblob avec php

                        × 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