Version complète: sur le forum Webmaster Hub : Insérer une image dans un fichier après avoir controlé son poids et sa taille
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
Dumbo
Bonjour,

Voilà, je propose à mes membres d'afficher des photos sur leur espace perso. Je n'ai jamais manipulé les images, ni les fichiers. Or j'ai lu qu'il est préférable de stocker les images dans des fichiers, plutôt que dans la BD.

Donc en fait, je veux faire cela :

CODE
if(poids de la photo < 30ko AND taille de la photo < 130px*130px)
{on insère l'image dans un fichier;}
else
{echo 'la photo doit faire moins de 30ko et 130px de coté';}


Mais je suis bloqué dès la première condition, pour le controle du poids (je n'ai donc même pas essayé la suite).

Je pensais y arriver avec fgets, mais ça ne m'avance pas et si je fais rien que ça :
CODE
$taille = fgets($_POST['photo']);
echo"$taille"


J'obtiens :

CODE
Warning: fgets(): supplied argument is not a valid stream resource in /home/site/page.php on line 660


Et ça m'affiche non pas la taille, mais le nom de l'image, genre image.gif.


Donc voilà, j'ai tout avoué, si vous pouvez m'aider à réaliser ça, ça serait super sympa.
Merci d'avance.
destroyedlolo
Bon, pas trop le temp mais :

filesize() te revera la taille du fichier

Pour la taille de l'image, il faut que tu regarde dans l'extention GD qui contient tout ce qu'il faut pour gerer une image.

A+

Lolo
captain_torche
Et sinon, les éléments uploadés sont accessibles via la variable $_FILES, et non $_POST.

Il faudra que ton formulaire soit de la forme :
HTML
<form method="post" action="ta_page.php" enctype="multipart/form-data">
Dumbo
Salut captain_torche,

Alors déjà, j'essaie d'afficher le poids de l'image, je fais ça :

Sur la page avec le bouton parcourir :
CODE
<form method="post" action="creation-site.php" enctype="multipart/form-data">
<input type="file" name="photo" value="parcourir">
</form>


Ca c'est sur la page de réception, j'essaie juste d'afficher le poids :
CODE
$photo=filesize($_FILES['photo']);
echo ''.$photo.'';


Et j'obtiens sur cette même page :
CODE
Warning: filesize() [function.filesize]: Stat failed for Array (errno=2 - No such file or directory) in
Remi
$_FILES['photo']['size']
(mais c'est la taille du transfert... Avant de faire un filesize() sur le fichier, il faut que tu renommes ton fichier)

Pour limiter la taille transmise, au lieu de contrôler après coup, utilise MAX_FILE_SIZE !
Dumbo
CITATION
$_FILES['photo']['size']
(mais c'est la taille du transfert... Avant de faire un filesize() sur le fichier, il faut que tu renommes ton fichier)

Pour limiter la taille transmise, au lieu de contrôler après coup, utilise MAX_FILE_SIZE !


Bon alors je comprend rien.
J'ai fais ça :
CODE
$photo=filesize($_FILES['photo']);
echo ''.$photo.'';

J'obtiens une erreur et on me dit que c'est parce que $_FILE['photo'] est un tableau. Super, je vois pas pourquoi mais bon, je veux bien croire tout ce que l'on me dit si ça fonctionne. Mais ça fonctionne pas... sick.gif

Donc , en clair, si je veux afficher seulement le poids de l'image et faire un test sur celui-ci , je fais quoi ? Quelles sont les étapes, s'il vous plait ?
lepidosteus
http://fr3.php.net/manual/fr/features.file-upload.php

Lire la doc avant tout smile.gif
Théo B.
Il faut déjà que tu la télécharge temporairement pour controler son poids non ?
Dumbo
CITATION

Bonne initiative, j'y vais de suite blush.gif


CITATION
Il faut déjà que tu la télécharge temporairement pour controler son poids non ?

euh... comment ça ? déjà je la télécharge pas, je l'upload, il me semble. Ensuite je dois afficher son poids avant de l'insérer dans le fichier (du moins là c'est ce que je veux faire, pour commencer).
Dumbo
Bon alors, j'ai lu la doc.

1) Voilà ce que j'ai fait pour obtenir le poids :

Page d'envoi :
CODE
<form method="post" action="creation-site.php" enctype="multipart/form-data">

<input type="hidden" name="MAX_FILE_SIZE" value="15000" />
<input type="file" name="photo" value="parcourir">

<input type="submit" name="pro-gratuit-8" value="envoyer">

</form>

Alors j'ai utilisé le champ hidden avec le nom MAX_FILE_SIZE pour avoir un poids maxi, comme j'ai pu le lire.

Après sur la page de réception, je fais ça :
CODE
if(is_uploaded_file($_FILES['photo']['tmp_name']))
{
   echo $_FILES['photo']['size'];
}


Alors là pour tout dire, j'ai récupéré le code sur le net. Donc is_uploaded_file, je ne sais pas trop à quoi ça sert. ['tmp_name'] a à priori c'est un attribu qui récupère le poids. Et pour l'afficher on écrit $_FILES['photo']['size'] (et pourquoi pas $_FILES['photo']['tmp_name'] r_question6161.gif

Bon donc j'arrive à afficher le poids, j'ai donc fait un pas mais franchement c'est gadouilleux.

Aussi, si le fichier uploadé à des espace dans son nom, par exemple "mon image.jpg", alors ça n'affiche pas le poids. Mais je pense que je peux changer le nom de fichier en lui attribuant par exemple la valeur de l'id du membre qui uploade.


2) Pour récupérer la taille, j'ai trouvé ça :

CODE
if($img = imagecreatefromgif($uploadfile))
                        {
                                if((ImageSX($img) == 16) && (ImageSY($img) == 12))
                                {
                                        $texte .= '<center><h3>Votre nouveau tag <img src="'.$uploadfile.'" border="0"> à bien été enregistrée !</h3><br><br><a href="./index.php">Retour a l\'accueil</a></center>';
                                }
                                else
                                {
                                        $texte .= '<center>Votre image ne respecte pas les dimensions ! Pour rappel, c\'est 16 pixels en largeur pour 12 en hauteur.<br><br><a href="./up_tag.php">Recommencer</a></center>';
                                        unlink($uploadfile);
                                }


Mais alors là, je ne vois pas pourquoi on fait imagecreateformgif($uploadfile) et ensuite, je pense que ImageSX et ImageSY sont fonction permettant d'obtenir la dimension (donc mon cas, faire <130 au lieu de ==16, puisque je veux que l'image fasse au maximum 130 pixel de coté.

Donc si quelqu'un peut me dire si j'ai pas fait d'erreur pour le poids et s'il peut m'expliquer comment faire pour comprendre et adapter la deuxième partie à mon cas, restera plus sans doute qu'à expédier l'image dans le fichier.

Petit à petit l'oiseau fait son nid... whistling.gif
Dumbo
Bon je continue de lutter, j'ai essayé ça :

CODE
$chemin = 'http://www.site.com/visu/membres/';

if (move_uploaded_file($_FILES['photo']['tmp_name'], $chemin.$_FILES['photo']['name']))
{
    echo "Le fichier ".$_FILES['photo']['name'].
            " a été téléchargé avec succès dans ".$chemin;
}

Et ça m'affiche :
CODE
Warning: move_uploaded_file(http://www.site.com/visu/membres/image.jpg) [function.move-uploaded-file]: failed to open stream: HTTP wrapper does not support writeable connections. in /home/site/scripts/compte/minisite/form-pro-gratuit.php on line 662

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpgDQvud' to 'http://www.site.com/visu/membres/image.jpg' in /home/site/scripts/compte/minisite/form-pro-gratuit.php on line 662


Sachant que le script se situe dans le répertoires scripts/compte/minisite, à l'extérieur du dossier WWW. Alors que le répertoire visu/membres, celui des images, se situe à l'intérieur du dossier WWW.

Donc déjà, avant de (re)voir la suite, quelqu'un peut-il m'expliquer cette erreur ? sad.gif
Dumbo
Bon alors j'ai mis un chemin relatif et c'est bon, ce petit script fonctionne et j'ai regardé dans le ftp de dreamweaver, l'image est arrivée dans le bon dossier.

Il me reste à :
- changer le nom de l'image pour lui attribuer par exemple le nom image_id_du_membre.jpg.
- controler que l'image est jpg, gif, ou un png, ou si c'est possible tout bascule en jpg par exemple.
- controler le poids et la taille.

Et quand tout ça est fait, alors seulement j'expédie l'image comme je viens de le faire.
Déjà pour changer le nom de l'image, je vois pas, puisque pour le peu que j'ai compris, je dois travailler avec le nom temporaire.

Je suis pas sorti de l'auberge.
Dumbo
Taratata, me revoilà eh eh !

Alors j'ai presque réussi. (je sais c'est fastoche, mais bon)

CODE
//on test si il y a le fichier photo

if(is_uploaded_file($_FILES['photo']['tmp_name']))
{
  //on test le poids
  if( filesize($_FILES['photo']['tmp_name']) <= 30000 )
  {//si le poids est inférieur à 30ko, on test les dimensions et le type du fichier
$chemin = 'visu/membres/';
$chemin2=$chemin.$_FILES['photo']['name'];
list($width, $height, $type, $attr) =getimagesize($_FILES['photo']['name']);
echo" $width - $height - $type  <p> ";

$datas=getimagesize($_FILES['photo']['name']);
echo $datas['mime'];
//on va tester les dimensions et le format du fichier
if($width<130 AND $height<130 AND ($type=="image.gif" OR $type=="image.jpg"))
{
//on passe le fichier du répertoire temporaire au répertoire définitif
    if (move_uploaded_file($_FILES['photo']['tmp_name'], $chemin.$_FILES['photo']['name']))  {
      echo "Le fichier ".$_FILES['photo']['name'].
            " a été téléchargé avec succès dans ".$chemin;
      echo'<p>'
    ;}//ferme if move_uploaded_file
   ;}//ferme le test des dimensions et du format
     else { //si dimension ou format mauvais
    echo'dimension ou format mauvais'
       ;}
;}//ferme le test du poids
  else  { //si poids >30KO, message d'erreur
    echo'fichier trop gros'
       ;}
}//ferme le test si le fichier est présent


Bon le problème, c'est que ça m'affiche ça :
CODE
Warning: getimagesize(bonne-taille-gif.gif) [function.getimagesize]: failed to open stream: No such file or directory in /home/site/www/photo-test.php on line 148
- -


Warning: getimagesize(bonne-taille-gif.gif) [function.getimagesize]: failed to open stream: No such file or directory in /home/site/www/photo-test.php on line 151
dimension ou format mauvais


Par contre avec ce code, je n'ai pas d'erreur à l'affichage. Mais il n'est pas valable car la condition sur les dimensions et le type mime n'est pas prévue, seul l'affiche est effectué :
CODE
if(is_uploaded_file($_FILES['photo']['tmp_name']))
{
  //on test le poids
  if( filesize($_FILES['photo']['tmp_name']) <= 30000 )
  {
    //si le poids est inférieur à 30ko, on l'insère
    $chemin = 'visu/membres/';
    if (move_uploaded_file($_FILES['photo']['tmp_name'], $chemin.$_FILES['photo']['name'])) {
      echo "Le fichier ".$_FILES['photo']['name'].
            " a été téléchargé avec succès dans ".$chemin;
      echo'<p>';
list($width, $height, $type, $attr) =getimagesize("visu/membres/barre-test.gif");
echo" $width - $height - $type -$attr <p> ";

$chemin2=$chemin.$_FILES['photo']['name'];
$datas =getimagesize("$chemin2");
echo $datas[mime];

    }
  }//ferme le test du poids
  else  { //si poids >30KO, message d'erreur
    echo'fichier trop gros'
       ;}
}//ferme le test si le fichier est présent
Dumbo
Bon c'est résolu.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.