Insérer une image après avoir controlé taille et poids

WRInaute passionné
Bonjour,

Je m'échine à essayer de permettre l'upload d'une image seulement si sa taille et son poids respectent les valeurs prévues.
Pour l'instant, j'en suis à controler le poids des images.

Voilà mon code sur la page du formulaire :
Code:
<form method="post" action="creation-site.php" enctype="multipart/form-data">

8/9 ) Votre photo :</b> ajoutez une photo pour renforcer votre pr&eacute;sentation (format 130px*130px et 30ko maximum).

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

<input type="hidden" name="choix" value="2">
<input type="hidden" name="acceptation" value="ok">
<input type="submit" name="pro-gratuit-8" value="envoyer">
</form>



Et le code sur la page de réception :
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 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;
}
;}//ferme le test du poids
//si poids >30KO, message d'erreur
else
{
echo'fichier trop gros'
;}
;}//ferme le test si le fichier est présent

Bon alors, si le fichier fait moins de 30ko, il est uploadé, je le retrouve dans le bon dossier.
Si le fichier fait plus de 30ko, alors il n'est pas uploadé, mais l'instruction du else n'est pas effectuée et le message echo'fichier trop gros' ne s'affiche pas.

J'ai essayé de modifier la valeur "MAX_FILE_SIZE" du input hidden pour être certain qu'elle soit supérieure aux fichiers de test, eux-mêmes supérieur à la valeur limite des conditions if, mais non, rien à faire, le echo n'est pas affiché.

Qui peut m'aider ?
 
WRInaute occasionnel
Sa m'interesse aussi!!! Hop je reco.

Je cherche également un script d'upload d'images de la part des navigateurs et par la suite, de les afficher avec des pages de navigation < 1 | 2 | 3 | 4...>

Dis moi...ya moyen de controler les parametre de resolution de l'images aussi?
 
WRInaute passionné
Merci pour le lien ACth. J'ai pas l'habitude de ces histoires de serveur et franchement, je pige pas lourd.

Là j'ai utilisé var_dump($_FILES); que j'ai écrit à la première ligne du code au-dessus.


ça me donne ça, mais je pige pas :

Upload d'une image faisant moins de 30ko, soit la limite autorisée :

Code:
array(1) { ["photo"]=>  array(5) { ["name"]=>  string(10) "LXXMMI.jpg" 

["type"]=>  string(10) "image/jpeg" ["tmp_name"]=>  string(14) 

"/tmp/php2AhOJh" ["error"]=>  int(0) ["size"]=>  int(29212) } } Le 

fichier LXXMMI.jpg a été téléchargé avec succès dans visu/membres/


Et voilà ce que ça m'affiche avec une image trop grosse :
Code:
array(1) { ["photo"]=>  array(5) { ["name"]=>  string(51) 

"chancelery__front__office__s1_.jpg" ["type"]=>  

string(0) "" ["tmp_name"]=>  string(0) "" ["error"]=>  int(2) ["size"]=>

Donc, comme j'ai dit, le problème pour l'instant c'est que je n'arrive pas à afficher le message d'erreur "image trop lourde" si l'image fait plus de 30KO.
 
WRInaute passionné
Ok, j'avais mis une valeur trop faible pour MAX_FILE_SIZE dans le hidden.

Maintenant, il y a encore des problèmes :
- Vérifier les dimensions de l'images, pour qu'elles soient inférieures à 130*130px.
- Si l'image uploadée a un nom du genre "mon image.jpg", soit avec un espace, alors on ne la retrouve pas dans le dossier de destination.
- Je dois controler si l'image est gif ou un jpg (éventuellement png).
 
WRInaute passionné
Oui mais là c'est pour créer une image. Moi je veux juste vérifier ses dimensions. Apparement ça serait plutôt à voir avec getimagesize(), non ?
 
WRInaute passionné
Et ça, qu'est-ce que ça vaut (trouvé sur le net) :

Code:
 if($img = imagecreatefromgif($uploadfile))
                        {
                                if((ImageSX($img) == 16) && (ImageSY($img) == 12))
                                {
                                     ok
                                }
                                else
                                {
                                        pas ok
                                }
 
WRInaute impliqué
Regarde bien la doc que je t'ai indiquée. Notamment au niveau de l'exemple et de la table des matières (toutes les fonctions en rapport avec les images sont listées avec une explication brève..).
 
WRInaute passionné
Taratata, me revoilà eh eh !

Alors j'ai presque réussi :cool: (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
 
WRInaute passionné
Bonne question.

Ligne 148 (juste en dessous de $chemin dans le troisième if):
Code:
 if (move_uploaded_file($_FILES['photo']['tmp_name'], $chemin.$_FILES['photo']['name'])) {

Ligne 151 :
Code:
$datas=getimagesize($_FILES['photo']['name']);
 
WRInaute impliqué
Etonnant, parce que d'après le warning, le problème provient de : getimagesize(bonne-taille-gif.gif)
 
WRInaute passionné
Ouais mais je suis une grosse vache, j'ai confondu le fichier où je travaille et l'original.

Donc la ligne 148, c'est celle là :
Code:
list($width, $height, $type,$attr)=
getimagesize($_FILES['photo']['name']);

Il ne trouve pas l'image.
J'ai rajouté :
Code:
$chemin.
devant $_FILES mais c'est pareil.
 
WRInaute impliqué
C'est normal tu recherche une image avec son nom, sans indiquer un chemin valide / valable.

Utilise cela : $_FILES['photo']['tmp_name'] = Le nom temporaire du fichier qui sera chargé sur la machine serveur.

c.f. la documentation php.. :wink:
 
WRInaute passionné
ok, bien vu ACth, merci.

Alors le problème n'est pas résolu pour autant, mais à force de reculer il va disparaître.

Maintenant le problème, c'est que le script réagit bien à la taille de fichier, puisque le message de confirmation est le bon, selon que le fichier est trop grand ou trop petit.

Le problème c'est qu'il ne l'insère pas pour autant.
C'est dans ce morceau apparement :
Code:
if($width<=130 AND $height<=130 )
 {
 //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

Donc là, j'ai le message, mais rien dans le dossier de réception...
 
WRInaute passionné
Bon ça fonctionne, apparement c'est le FTP de dreamweaver qui était pas synchro... :aie:


Bon reste deux détails, dont le test du type mime.

Donc je fais ça :
Code:
list($width, $height, $type, $attr) =getimagesize($_FILES['photo']['tmp_name']);
echo" $width - $height - $type  <p> ";
$datas=getimagesize($_FILES['photo']['tmp_name']);
echo $datas['mime'];
 //on va tester les dimensions et le format du fichier
[B] if($width<=130 AND $height<=130 AND ($type=="image.gif" OR $type=="image.jpg"))[/B]

Et bien ça bloque les .png, mais en fait ça bloque tout, les .gif et les .jpg.
 
WRInaute passionné
Bon alors en fait tout fonctionne bien, il me reste qu'à renommer le nom de l'image afin d'avoir des noms uniformes du style :

1.jpg
2jpg

etc...

les numéros étant les identifiants des membres.
 
WRInaute impliqué
Je savais que tu y arriverais, tout est dans la doc.
Seul l'impatience fait que l'on ne consulte pas tout.

:wink:
 
Discussions similaires
Haut