PHP conversion image avant de l'inserer dans la base de donnée

Résolu
lerod83 Messages postés 69 Statut Membre -  
bg62 Messages postés 23433 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour à tous,

A l'aide s'il vous plait!

Je veux, lors de l'envoie d'un formulaire, convertir les images uploader par l'utilisateur.

Ce que j'ai en ce moment :
1- Un script formulaire
2- Script PHP pour récupération des $_POST et $_FILES pour insérer dans une base de donnée.
3- Fonction de conversion GD PHP

Ce que je voudrais faire :
- Convertir l'image avant de les sauvegarder dans un dossier spécifique avec lequel la base de donnée se relie.
- Cette conversion concerne la taille et la qualité comme je vais vou le montrer sur les script ci-dessous.
- Comment introduire cette fonction converImage dans l'Extract $_POST ?
- Si vous avez aussi l'idée de l'appliquer sur le format GIF et PNG. Je n'ai pas encore essayé mais si vous voulez l'aborder ce sera mieux !

FONCTION convertImage

convertImage('original/img212.jpg', 'final/img212.jpg', '640', '480', '100');
//original est le dossier qui content l'image source
//final c'est pour la destination de l'image redimensionnée

function convertImage($sources, $dest, $width, $height, $quality){
$imageSize = getimagesize($sources);
$imageRessource = imagecreatefromjpeg($sources);
$imageFinal = imagecreatetruecolor($width,$height);
$final = imagecopyresampled($imageFinal, $imageRessource, 0, 0, 0, 0, $width, $height, $imageSize[0], $imageSize[1]);
imagejpeg($imageFinal, $dest, $quality);
}

SCRIPT FORMULAIRE

<div class = 'saryTambatra'>
<form method = "POST" action="" enctype="multipart/form-data">

<table class='tabForm'>

<tr>
<td class='nomArticle'>Nom de l'article :</td>
<td><input type='text' class='inputArticle' name = 'nomAricle'></td>
</tr>

<tr>
<td class="titrePrix">Prix:</td>
<td class='inputPrix'><input type="texte" class="prixArticle" name="prixArticle"></td>
</tr>

<tr>
<td class='titreDescrArticle'>Description :</td>
<td><textarea type='text' class='descrArticle' name = 'descrArticle'></textarea></td>
</tr>

</table><br/>

<div class="saryTambatra">
<p class='img1'>Image n°01</p>
<input type="file" class="upload1" name="image1" /><br/>

<p class='img2'>Image n°02</p>
<input type="file" class="upload2" name="image2" /><br/>

<p class='img3'>Image n°03</p>
<input type="file" class="upload3" name="image3" />
</div><br/>

<input type = 'submit' name = 'subArticle' value = 'Ajouter'>

</form>
</div>

SCRIPT S_POST / $_FILES

<?php
session_start();

require_once("include/connexion.php");

if(isset($_POST['subArticle'])){

extract($_POST);
$nomArt = $_POST['nomAricle'];
$prixArt = $_POST['prixArticle'];
$descrArt = $_POST['descrArticle'];
$idmbr =$_POST['id_membre'];
$pseudo = $_SESSION['pseudo'];

$image1 = $_FILES["image1"]["name"];
$image2 = $_FILES["image2"]["name"];
$image3 = $_FILES["image3"]["name"];

$file_tmp_img1 = $_FILES["image1"]["tmp_name"];
$file_tmp_img2 = $_FILES["image2"]["tmp_name"];
$file_tmp_img3 = $_FILES["image3"]["tmp_name"];

move_uploaded_file($file_tmp_img1,"images/articles/$image1");
move_uploaded_file($file_tmp_img2,"images/articles/$image2");
move_uploaded_file($file_tmp_img3,"images/articles/$image3");

$query = $con_db->prepare(
'INSERT INTO articleboutik(
pseudo,
nomArt,
prixArt,
descrArt,
saryArt1,
saryArt2,
saryArt3
)
VALUES(
:pseudo,
:nomAricle,
:prixArticle,
:descrArticle,
:image1,
:image2,
:image3
)
');
$query->bindParam(':id_membre',$idmbr, PDO::PARAM_STR);
$query->bindParam(':pseudo',$pseudo, PDO::PARAM_STR);
$query->bindParam(':nomAricle',$nomArt, PDO::PARAM_STR);
$query->bindParam(':prixArticle',$prixArt, PDO::PARAM_STR);
$query->bindParam(':descrArticle',$descrArt, PDO::PARAM_STR);
$query->bindParam(':image1',$image1, PDO::PARAM_STR);
$query->bindParam(':image2',$image2, PDO::PARAM_STR);
$query->bindParam(':image3',$image3, PDO::PARAM_STR);
$query->execute();

header ('location: index.php');

}

Comptant sur vôtres précieuses aides.
Merci d'avance !

2 réponses

  1. gardiendelanuit Messages postés 1772 Date d'inscription   Statut Membre Dernière intervention   267
     
    Bonjour,

    Pour résumer et être sûr d'avoir compris, ce que tu veux c'est modifier la taille des images et les convertir dans un format particulier?

    Si oui, regarde du côté des fonctions php GD imagecreatefromgif, imagecreatefromjpeg imagecreatefrompng et imagecopyresized.

    C'est bien ce que tu recherches?
    0
    1. lerod83 Messages postés 69 Statut Membre
       
      Bonsoir,
      D'abord merci pour votre reponse.

      Vous voyez,
      Ce que je cherche c'est lorsqu'un utilisateur valider le formulaire, c'est à dire les information qu'il entre y compris les images. Je veux que que quelque soit la taille de ses image, je veux les reduire à un format quelconque avant de les "move_uploaded_file" .

      Si vous pouvez regarder mes script, j'ai une fonction de conversion qui marche bien (je l'ai déjà testé hors de cette formulaire) et je me demande: comment l'introduire à la recupération des $_POST ou plus précisement $_FILES parce qu'il s'git d'une image. Et tout cela avant de les stocker dans le dossier de destination(move_uploaded_file/...)

      Je ne veux pas modifier leur extention (jpeg, png, gif), non!

      Merci.
      Cordialement.

      Lerod
      0
      1. gardiendelanuit Messages postés 1772 Date d'inscription   Statut Membre Dernière intervention   267 > lerod83 Messages postés 69 Statut Membre
         
        Dans ce cas tu peux utiliser les variables $file_tmp_imgX comme chemin source de l'image que tu veux modifier pour ensuite l'enregistrer où tu veux.

        Par contre je crois que $_FILES['mon_image']['tmp_name'] te retourne uniquement le nom de l'image temporaire stockée sur le serveur, pas son chemin complet.
        Utilise
        $tmp_filepath = sys_get_temp_dir() . $_FILES['mon_image']['tmp_name']
        convertImage($tmp_filepath, 'final/'.$_FILES['mon_image']['name'], '640', '480', '100');

        dans ce cas, mais je recommande vivement d'utiliser un nom que tu mets toi même pour l'image de sortie pour éviter les collisions.
        Du style
        $_FILES['mon_image']['name'].md5($_FILES['mon_image']['name']).$ext;
        par exemple (avec $ext l'extension que ton fichier de sortie).
        0
    2. lerod83 Messages postés 69 Statut Membre
       
      Merci beaucoup!

      Je vais les tester ce soir parce que je suis encore au bureau et je vous donnerai un retour demain.

      Ecore merci et bonne cintinuation.
      0
    3. lerod83 Messages postés 69 Statut Membre
       
      Bonjour,

      J'ai fais comme vous m'avez conseillé, mais il y a encore d'erreurs!

      Voila ce qui se passe:

      L'image a bien été redimensionnée à taille 640*480 et stocké dans le dossier "final" MAIS il n'y a que de fond noir, elle a la même extension que l'image uploadé (.jpg).
      Et quelques messages d'erreurs:

      Warning: getimagesize: failed to open stream: Invalid argument
      Warning: imagecreatefromjpeg: failed to open stream: Invalid argument
      Warning: imagecopyresampled: failed to open stream: Invalid argument

      Ci bas le script:




      <!--formulaire-->

      <?php
      
      
      if(isset($_POST['subArticle'])){
      
              extract($_POST);
                           $nomArt = $_POST['nomAricle'];
                           $prixArt = $_POST['prixArticle'];
                           $descrArt = $_POST['descrArticle'];
                          
                          
                       $image1 = $_FILES["image1"]["name"];
                          
                       $file_tmp_img1 = $_FILES["image1"]["tmp_name"];
                          
                       $tmp_filepath = sys_get_temp_dir() . $_FILES['image1']['tmp_name'];
                          
                      
      
              function convertImage($sources, $dest, $width, $height, $quality){
                  $imageSize = getimagesize($sources);
                  $imageRessource = imagecreatefromjpeg($sources); 
                  $imageFinal = imagecreatetruecolor($width,$height);
                  $final = imagecopyresampled($imageFinal, $imageRessource, 0, 0, 0, 0, $width, $height, $imageSize[0], $imageSize[1]);
                  imagejpeg($imageFinal, $dest, $quality);
              }
              
              
              convertImage($tmp_filepath, 'final/'.$_FILES['image1']['name'], '640', '480', '100');
      }
      ?>

      EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
      Explications disponibles ici :
      https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

      Merci d'y penser dans tes prochains messages.


      En attendant impatiemment votre reponses.

      Merci. et bonne journée

      Cordialement
      0
  2. lerod83 Messages postés 69 Statut Membre
     
    Quelqu'un peut m'aider s'il vous plait!

    Merci!
    0
    1. lerod83 Messages postés 69 Statut Membre
       
      Bonjour à tous,
      j'ai trouvée la solution.

      Bonne Fin d'année!
      0
    2. bg62 Messages postés 23433 Date d'inscription   Statut Modérateur Dernière intervention   2 435
       
      ah oui, ben tant pieux ET quelle est-elle, ce serait bien d'en faire profiter tout le monde ;)
      0