8768 sujets

Développement web côté serveur, CMS

Bonjour, Hello à tutti,

J'upload 5 images au format variable (jpg, jpeg png, ou webp) dans le dossier temp/$pseudo.
Je fais ça avec croppie.js, afin qu'elles aient toutes le même format final (740x1080px), et que l'utilisateur puisse zoomer et recadrer si il le souhaite.
Le 1er soucis, c'est que le poids des images uploadées est multiplié par 5 (base64). Je n'ai pas trouvé comment empêcher ça, donc j'ai opté pour la fonction compress, qui me retourne des images à un poids tout à fait correct.

Problème : alors que mes 5 images (img_1.jpg, img_2.jpg, etc) se trouvent dans le dossier temp/$pseudo,
lorsque je souhaite les compresser, puis les changer de dossier, et enregistrer le chemin en base, seulement les 2 premières images sont traitées, et les 3 autres sont supprimées. Je n'arrive pas à comprendre pourquoi.

En gros, $img_3_path m'indique : img_3 (peut importe son extension) n'existe pas, alors que si ! img_3.jpg est bien dans le dossier temp/$pseudo.
if (file_exists($img_3_path )) { } else { echo "<script>alert('".$img_3_path." n y est pas');</script>"; }


Merci pour vos lights Smiley smile
Edité


<?php

function compress($source, $destination, $quality) 
{
    $info = getimagesize($source); //print_r($info);

    if ($info['mime'] == 'image/jpeg')   $image = imagecreatefromjpeg($source);
    elseif ($info['mime'] == 'image/jpg') $image = imagecreatefromjpeg($source);
   elseif ($info['mime'] == 'image/webp') $image = imagecreatefromwebp($source);  
   elseif ($info['mime'] == 'image/png') $image = imagecreatefrompng($source);   
   
    imagejpeg($image, $destination, $quality);                        
    return $destination;
}
        
$imgs_1_paths = array("temp/".$pseudo."/img_1.jpg", "temp/".$pseudo."/img_1.jpeg", "temp/".$pseudo."/img_1.webp", "temp/".$pseudo."/img_1.png");    

$imgs_2_paths = array("temp/".$pseudo."/img_2.jpg", "temp/".$pseudo."/img_2.jpeg", "temp/".$pseudo."/img_2.webp", "temp/".$pseudo."/img_2.png"); 

$imgs_3_paths = array("temp/".$pseudo."/img_3.jpg", "temp/".$pseudo."/img_3.jpeg", "temp/".$pseudo."/img_3.webp", "temp/".$pseudo."/img_3.png"); 

$imgs_4_paths = array("temp/".$pseudo."/img_4.jpg", "temp/".$pseudo."/img_4.jpeg", "temp/".$pseudo."/img_4.webp", "temp/".$pseudo."/img_4.png");  

$imgs_5_paths = array("temp/".$pseudo."/img_5.jpg", "temp/".$pseudo."/img_5.jpeg", "temp/".$pseudo."/img_5.webp", "temp/".$pseudo."/img_5.png"); 


foreach($imgs_1_paths as $img_1_path)
{                           
    $img_1 = substr($img_1_path, strrpos($img_1_path, '.')-5);          
    $ext = substr($img_1_path, strrpos($img_1_path, '.')+1);
    $img_1_path = "temp/".$pseudo."/img_1.".$ext;
    clearstatcache();
    if (file_exists($img_1_path ))
        {          
                                     
            $source_img = $img_1_path;                                
            $titre_de_limage = $img_1.'_1.'.$ext;                               
            $new_path = 'user_images/'.$titre_de_limage;
            $img_compressed = compress($source_img, $new_path, 90);  // ça enregistre l'image compressée dans le dossier de destination (new path)   

            $q1 = $con->prepare("UPDATE users SET   img = ?,  user_image_1 = ?  WHERE user_id = ?"); 
            $q1->bind_param("ssi",   $new_path,  $titre_de_limage, $user_id);
            $q1->execute();    
            
            unlink($img_1_path);                                          
        }                     
}

foreach($imgs_2_paths as $img_2_path)
{                           
    $img_2 = substr($img_2_path, strrpos($img_2_path, '.')-5);          
    $ext = substr($img_2_path, strrpos($img_2_path, '.')+1);
    $img_2_path = "temp/".$pseudo."/img_2.".$ext;
   clearstatcache();

    if (file_exists($img_2_path ))
        {           
                             
            $source_img = $img_2_path;                                
            $titre_de_limage = $img_2.'_2.'.$ext;                               
            $new_path_2 = 'user_images/'.$titre_de_limage;
            $img_compressed = compress($source_img, $new_path_2, 90);     

            $q2 = $con->prepare("UPDATE users SET user_image_2 = ?  WHERE user_id = ?"); 
            $q2->bind_param("si",  $new_path_2, $user_id);
            $q2->execute();    
            
          unlink($img_2_path);                                          
        }                     
}  

foreach($imgs_3_paths as $img_3_path)
{                           
    $img_3 = substr($img_3_path, strrpos($img_3_path, '.')-5);          
    $ext = substr($img_3_path, strrpos($img_3_path, '.')+1);
    $img_3_path = "temp/".$pseudo."/img_3.".$ext;

    clearstatcache();
   
    if (file_exists($img_3_path ))
        {                                                 
            $source_img = $img_3_path;                                
            $titre_de_limage = $img_3.'_3.'.$ext;                               
            $new_path_3 = 'user_images/'.$titre_de_limage;
            $img_compressed = compress($source_img, $new_path_3, 90);    

            $q3 = $con->prepare("UPDATE users SET user_image_3 = ?  WHERE user_id = ?"); 
            $q3->bind_param("si",  $new_path_3, $user_id);
            $q3->execute();    
            
          unlink($img_3_path);                                         
        }        else   { echo "<script>alert('".$img_3_path." n y est pas');</script>";  }           
}

foreach($imgs_4_paths as $img_4_path)
{                           
    $img_4 = substr($img_4_path, strrpos($img_4_path, '.')-5);          
    $ext = substr($img_4_path, strrpos($img_4_path, '.')+1);
    $img_4_path = "temp/".$pseudo."/img_4.".$ext;
   
    clearstatcache();
    if (file_exists($img_4_path ))
        {                                   
            $source_img = $img_4_path;                                
            $titre_de_limage = $img_4.'_4.'.$ext;                               
            $new_path_4 = 'user_images/'.$titre_de_limage;
            $img_compressed = compress($source_img, $new_path_4, 90);     

            $q4 = $con->prepare("UPDATE users SET  user_image_4 = ?  WHERE user_id = ?"); 
            $q4->bind_param("si",  $new_path_4, $user_id);
            $q4->execute();    
            echo "<script>alert(' 4 : ". $new_path_4 ."');</script>"; 
          //  unlink($img_4_path);                                          
        }                     
}

foreach($imgs_5_paths as $img_5_path)
{                           
    $img_5 = substr($img_5_path, strrpos($img_5_path, '.')-5);          
    $ext = substr($img_5_path, strrpos($img_5_path, '.')+1);
    $img_5_path = "temp/".$pseudo."/img_5.".$ext;
    clearstatcache();
    if (file_exists($img_5_path ))
        {                                   
            $source_img = $img_5_path;                                
            $titre_de_limage = $img.'_5.'.$ext;                               
            $new_path_5 = 'user_images/'.$titre_de_limage;
            $img_compressed = compress($source_img, $new_path_5, 90);  // ça enregistre l'image compressée dans le dossier de destination (new path)   

            $q5 = $con->prepare("UPDATE users SET user_image_5 = ?  WHERE user_id = ?"); 
            $q5->bind_param("si", $new_path_5, $user_id);
            $q5->execute();    
            echo "<script>alert(' 5 : ". $new_path_5 ."');</script>"; 
           // unlink($img_5_path);                                          
        }                     
}

Modifié par Vape6 (19 Mar 2022 - 17:48)
Modérateur
Bonjour,

A premiere vue:
tu fais un foreach pour chercher ton image avec différentes extensions, jpg,jpeg,webp et png. a priori tu en as au moins trois qui n'existerais pas (à moins que tu sauvegardes chaque images en 4 formats) . Ta boucle va devrait indiquer trois fois sur quatre que l'image n'existe pas.

cdt
Bonjour,

Merci, mais je ne comprends pas bien.

Effectivement, ma boucle va indiquer 3 fois sur 4 que l'image n'existe pas, auquel cas, on ne fait rien, on passe juste à la vérification suivante. Je n'ai pas dit, si l'image dans telle extension n'existe pas, supprime les autres à venir....
Je ne comprends pas pourquoi mes images de 3 à 5 sont supprimées.

---
Je me suis peut-être mal expliquée :
img_1 et img_2 sont bien sauvegardées (peu importe leur extension), mais img_3, img_4 et img_5 sont supprimées de mon dossier temp, alors que n'en donne pas l'instruction.

Merci
Modifié par Vape6 (22 Mar 2022 - 10:45)
Modérateur
Bonjour,

Dans ta fonction compress(); tu ne vérifie pas si l'image a bien été créée :

essaie voir si par exemple :
if(imagejpeg($image, $destination, $quality))
{
return $destination;
}
else {
echo'oups, raté';
// return continue ; // jamais tester , l'idée est de faire un saut dans la boucle d'appel pour ne pas effacer ton image de reference (tmp) sinon l’intégrer dans ta boucle si imagejpeg te retourne false
}

t'indique que certaines images n'ont pas été générées. (un process trop long ? )

La fonction reprise pour test:
function compress($source, $destination, $quality) 
{
    $info = getimagesize($source); //print_r($info);

    if ($info['mime'] == 'image/jpeg')   $image = imagecreatefromjpeg($source);
    elseif ($info['mime'] == 'image/jpg') $image = imagecreatefromjpeg($source);
   elseif ($info['mime'] == 'image/webp') $image = imagecreatefromwebp($source);  
   elseif ($info['mime'] == 'image/png') $image = imagecreatefrompng($source);   
   
   if(imagejpeg($image, $destination, $quality))
      {
            return $destination;
      }
      else {
            echo'oups, raté';
            // return continue ; // jamais tester , l'idée est de faire un saut dans la boucle d'appel pour ne pas effacer ton image de reference (tmp) sinon l’intégrer dans ta boucle si imagejpeg te retourne false
      }
   }

Modifié par gcyrillus (22 Mar 2022 - 13:45)
Merci.
Tu me disais que mes foreach étaient un peu longs. Je suppose que le problème vient de là, car en virant la fonction compress ainsi que tout ce qui s'y rapporte ( $img_compressed = compress($source_img, $new_path_5, 90);) , mes images à partir de img_3 sont quand-même supprimées du dossier temp. C'est bizarre. Pourquoi ça fait ça ?

Ca indique que le fichier n'existe pas, alors qu'il existe, et de ce fait, ça le supprime. Why ? et comment faire donc ?
Thanks
Modérateur
Vape6 a écrit :
Merci.
Tu me disais que mes foreach étaient un peu longs. Je suppose que le problème vient de là, car en virant la fonction compress ainsi que tout ce qui s'y rapporte ( $img_compressed = compress($source_img, $new_path_5, 90);) , mes images à partir de img_3 sont quand-même supprimées du dossier temp. C'est bizarre. Pourquoi ça fait ça ?

Ca indique que le fichier n'existe pas, alors qu'il existe, et de ce fait, ça le supprime. Why ? et comment faire donc ?
Thanks

Je m’interrogeais sur un 'process trop long' où ta config serveur ne lui laisserait éventuellement pas le temps de se finir ,sans juger ton code ou config(s) que tu as. voir https://www.php.net/manual/fr/info.configuration.php#ini.max-execution-time pour comprendre ce que je voulais dire . peut tu nous dire quelle tailles font tes fichiers images ? parce-que cela peut prendre un moment à les téléchargées puis les repasser à la moulinette

Là et pour moi , il n'est plus très clair de ce que tu fais
* as tu tester ma proposition? et avec quels résultats ?
* y'a t-il toujours dans tes boucles unlink($img_X_path); car si tu les à enlevé, c'est que les images n’étaient pas là dés le départ, non?
* As tu vérifier que tes fichiers temporaires étaient bien là et valides ou fait un var_dump($info) par exemple pour vérifier que tu avais bien une image dans $source et pas un fichier vide ou corrompu ?

cdt
Modifié par gcyrillus (22 Mar 2022 - 19:02)
* max-execution-time : j'ai passé max_input_time à Default Value: 0. Ces lignes étaient commentées. Correct ? Si correct, cela ne change rien au problème.

* Oui j'ai testé ta proposition, bien sûr, mais ça n'a eu aucun résultat, pour l'instant en tous cas.

* Les photos img_1.jpg, img_2.png, img_3.webp, img_4.jpg, img_5.jpg (extensions variables) sont bien uploadées dans le dossier temp/user_36. Elles y sont, et ne présentent pas de corruption à l'ouverture des fichiers.
Ensuite, je les renomme puis les déplace dans un autre dossier, d'où les unlink.

* Comme indiqué précédemment, lorsque je supprime tout le code contenu dans if (file_exists),
les photos à partir de img_3 et au-delà sont supprimées de temp/user_36, alors que je ne fais rien pour.

Merci Smiley smile
Modérateur
okay, du coup, je suis comme toi sans comprendre pourquoi elles sont effacées sans aucune intervention de ton script. Il y a peut-être une subtilité ou une typo que je ne vois pas.

edit : evite le max-execution-time à 0 si tu ne veut pas te retrouver en orbite sur un script qui boucle à l'infini Smiley cligne remet ta config comme elle etait. C'est à toucher seulement si tu as vraiment besoin d'allonger ou reduire cette valeur . 0 c'est risquer de se prendre un freeze
Modifié par gcyrillus (22 Mar 2022 - 19:10)
"evite le max-execution-time à 0". Ok.
Oui, j'ai lu que 0 ou -1 peut provoquer des unexpected results...

Ok. J'ai beau lire et relire mon code, je n'y vois aucune erreur... Smiley ohwell
If file_exists n°3 & 4 et 5, se comportent en if file_exists > delete it.
Quelle pourrait en être la raison ? php 8.1 ? base64 ?
C'est fou ça...

Thanks Smiley smile
Okay okay....... J'ai avancé dans mon debugging, mais je ne sais pas vraiment pourquoi ça foire avec les jpg. (à moins que ce soit parce que les jpg sont trop lourdes +/- 1.5Mo > alors que je limite chaque image pour l'upload à 350Ko.
Comme énoncé précédemment, croppie.js transforme les images en base64, et augmente leur poids initial qu'il multiplie x5.
Est-ce pour autant que le file est vu comme non existant ? Visiblement oui, mais c'est pas normal...

Mon code fonctionne parfaitement (et tel qu'il était de base lorsque je vous l'ai posté) si j'upload 5 webp, mais il s'arrête au bout de 2 jpg.
Si je mets 4 webp + 1 jpg, tout roule pour les 4 webp, mais la img_5.jpg est supprimée lors du if file_exists.

C'est déjà un début.
Que faire d'autre pour faire fonctionner ce humhum de code ?!!

Thanks les codasseurs Smiley smile
Modifié par Vape6 (22 Mar 2022 - 22:09)
Alleluyah... Smiley smile

Bon, comme hier j'ai remarqué que tout se passait comme sur des roulettes avec les uploads en webp, je convertis tout en webp. Poids idéal. Plus besoin de la func compress.
Tout roule de A à Z, c'est parfait donc.

Merci gcyrillus pour ton aide,
Bonne journée
Modifié par Vape6 (23 Mar 2022 - 13:14)