Aller au contenu

Insérer une image dans un fichier après avoir controlé son poids et sa taille


Sujets conseillés

Posté (modifié)

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 :

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 :

$taille = fgets($_POST['photo']);
echo"$taille"

J'obtiens :

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.

Modifié par Dumbo
Posté

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

Posté

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 :

<form method="post" action="ta_page.php" enctype="multipart/form-data">

Posté

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 :

<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 :

$photo=filesize($_FILES['photo']);
echo ''.$photo.'';

Et j'obtiens sur cette même page :

Warning: filesize() [function.filesize]: Stat failed for Array (errno=2 - No such file or directory) in

Posté

$_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 !

Posté (modifié)
$_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 :

$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:

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 ?

Modifié par Dumbo
Posté (modifié)

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

Modifié par Théo B.
Posté

Bonne initiative, j'y vais de suite :blush:

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).

Posté

Bon alors, j'ai lu la doc.

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

Page d'envoi :

<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 :

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'] :?:

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 :

 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:

Posté

Bon je continue de lutter, j'ai essayé ça :

$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 :

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 ? :(

Posté

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.

Posté

Taratata, me revoilà eh eh !

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

 //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 :

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é :

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

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...