PHPNET Assistance

Support et Entraide PHPNET => Forum général d'entraide => Discussion démarrée par: Mikado le 27 juin 2003 à 15:59:41

Titre: Upload D'images Jpg
Posté par: Mikado le 27 juin 2003 à 15:59:41
Je souhaiterais que les utilisateurs de ma bdd puissent charger ponctuellement, cad le temps d'un traitement, un scan de fonds de carte en jpg de 150Ko. Le traitement consisterait à positionner des points sur la carte. Il est bien sûr hors de question que chacun stocke sa collection de cartes sur le serveur.
Alors dites moi :
- si la chose vous paraît possible
- et si oui de quelle façon?
Merci de vos réponses.
Titre: Upload D'images Jpg
Posté par: spontex le 27 juin 2003 à 16:42:48
Salut,

Je fais quelque chose qui ressemble fort à ça, sur DvdToile : les membres de la rédac' peuvent uploader des images, soit d'autres sites, soit de leur disque dur, et après upload, elles sont redimensionnées à la bonne taille, puis placées sur le site.
Pour ton besoin, il te faut une page "formulaire" avec un champ de saisie de fichier (qui offre un bouton Parcourir), et, quand tu valides, ça appelle un script PHP, qui vérifie que le fichier passé est bien un JPG, au bon format, qui fait le traitement (fonction graphique ? use the GDLib !), puis place l'image dans un répertoire donné. On renvoie alors l'utilisateur vers une page qui affiche cette fameuse image, d'où il peut la télécharger, puis l'effacer.
Pour les ptits malins qui n'effaceraient pas leur image : à chaque insertion de nouvelle image, on vérifie le contenu du répertoire, et on efface les "vieilles" images (vieilles étant à définir).

A+, n'hésite pas si tu te poses des questions.
Titre: Upload D'images Jpg
Posté par: Mikado le 27 juin 2003 à 19:04:26
Merci Spontex de ta réponse,

- OK pour le champ de saisie de fichier avec bouton Parcourir,
- comment vérifier le format du fichier, je suppose qu'il doit exister des fonctions idoines,
- pour ce qui concerne le traitement,
j'ai 2 tables, une table 'images' qui contient la description de l'image,
et une table 'points' qui stocke les x et y des points à positionner sur l'image...mais je ne connais pas GDLib :(
- place l'image dans un répertoire donné: cela veut-il dire qu'il me faudra 1 répertoire par utilisateur?
- OK pour le reste.
 
Titre: Upload D'images Jpg
Posté par: GUiW le 28 juin 2003 à 11:24:21
Mikado, tu trouveras à cette adresse un script d'upload plutot complet, de quoi t'inspirer donc :).


http://www.phpapps.org/index.php?action=so...r_source&id=167 (http://www.phpapps.org/index.php?action=sources&go=voir_source&id=167)
 
Titre: Upload D'images Jpg
Posté par: Mikado le 29 juin 2003 à 10:50:16
Merci GUIW, ça va bien m'aider. J'ai même trouvé un script de redimensionnement d'image fort intéressant.
Titre: Upload D'images Jpg
Posté par: spontex le 30 juin 2003 à 11:23:29
Citer
Merci Spontex de ta réponse,

- OK pour le champ de saisie de fichier avec bouton Parcourir,
- comment vérifier le format du fichier, je suppose qu'il doit exister des fonctions idoines,
- pour ce qui concerne le traitement,
j'ai 2 tables, une table 'images' qui contient la description de l'image,
et une table 'points' qui stocke les x et y des points à positionner sur l'image...mais je ne connais pas GDLib :(
- place l'image dans un répertoire donné: cela veut-il dire qu'il me faudra 1 répertoire par utilisateur?
- OK pour le reste.
- Pour vérifier le format de fichier, il y a sûrement une fonction toute faite, mais :
if (strtolower(substr($imgfile, -3)) == 'jpg')
marche très bien.

- La GDLib fait partie du langage PHP ... donc plus aucune excuse maintenant :-) Pour placer tes points dessus tu peux utiliser par exemple : imagefilledellipse ( resource image, int cx, int cy, int w, int h, int color) qui, avec w=h, te donnera de petits cercles en (cx, cy).

- Non, pour resizer ton image tu utilises juste :
imagecopyresampled($vignette, $image,0,0, 0,0, $nouvelle_largeur, $nouvelle_hauteur,$largeur,$hauteur);
(où $image désigne ton image d'origine, et $vignette ton image redimensionnée)

Et pour l'enregistrer là où tu veux :

ImageJpeg($vignette, "$uploaddir/$id.jpg", 90); pour une qualité de 90%. C'est toi qui la mets où tu veux.

A+
 
Titre: Upload D'images Jpg
Posté par: Mikado le 30 juin 2003 à 14:11:07
Merci Spontex!
Lorsque je teste Imagefilledellipse EasyPhp1.6 me réclame GD2. Je suis donc allé sur boutell.com récupérer gd-2.0.8.zip.
Avant de faire une c....rie, comment doit on s'y prendre pour faire l'update?
Titre: Upload D'images Jpg
Posté par: spontex le 30 juin 2003 à 14:21:07
Je t'avoue que je n'utilise pas EasyPHP, je fais tout directement "en ligne" :-)
Mais la GD est désormais incluse dans le langage PHP, tu n'as donc plus à installer la GDLib séparément, normalement. L'inconvénient d'Easy PHP, c'est que tu n'as pas la même version que sur PhpNet ! On est en PHP 4.2.2 alors qu'EasyPHP 1.6 offre PHP 4.2.0 :-)

Mais c'est bizarre tout ça, imagefilledellipse est apparue en PHP 4.0.6, tu devrais donc l'avoir dans EasyPHP 1.6...  :(  
Titre: Upload D'images Jpg
Posté par: Mikado le 30 juin 2003 à 23:58:47
Tout fonctionne bien (test du format, upload OK) sauf à la dernière étape...
- mon image 600x800 est affichée à l'écran
- dans ma fonction, pour remplacer imagefilledellipse, j'ai testé ceci :
...
$x .= imagerectangle ($im, 300, 400, 500, 500, 'red');
return $x;

...aucune erreur ($x renvoie 1) mais le rectangle rouge est invisible...damned :angry:

Quelqu'un a une idée? (j'utilise EasyPHP1.6).
Titre: Upload D'images Jpg
Posté par: spontex le 01 juillet 2003 à 10:20:25
Oui,

'red' ce n'est pas bon : fais un

$red = ImageColorAllocate($im, 255, 0, 0);
puis : $x .= imagerectangle ($im, 300, 400, 500, 500, $red);

Et n'oublie pas que là, tu n'auras que le contour ! Utilise imagefilledrectangle pour avoir également l'intérieur du rectangle. Bon courage....
Titre: Upload D'images Jpg
Posté par: Mikado le 01 juillet 2003 à 12:16:45
En désespoir de cause, voici ma fonction dépouillée de tous les contrôles :

Citer
    global $base,$bouton,$id,$fichier;
   $x = "";
   $x .= "<br><table align=left width='100%' border=0 bgcolor=#E4DCD2>";
   $x .= "<tr><td align=center width='100%'> ";   
   $x .= "<p1>Fichier à télécharger :</p1><input name=\"fichier\" type=\"file\" value=\"\" size=\"50\">";
   $x .= boutonImage ("./images/telech.jpg","boutonUpload", "23", "20");
   $x .= "</td></tr>";
   
   if($bouton == "boutonUpload")
   {
   $fichier = stripslashes($fichier);
   $extension = strtolower(substr($fichier, -3));
   $im = imagecreatefromjpeg($fichier);
   $in = fopen($fichier, "rb");
   $size = getimagesize($fichier);
   $large = $size[0];
   $haut = $size[1];
   $x .= "<tr><td><img src=\"$fichier\" width=$large height=$haut></td></tr></table>";   
   $red = ImageColorAllocate($im, 255, 0, 0);
   $x .= imagefilledrectangle ($im, 300, 200, 500, 500, $red);
   }//upload
   return $x;

Qu'est ce qui cloche?
Titre: Upload D'images Jpg
Posté par: spontex le 01 juillet 2003 à 12:22:26
lol... il te manque la fin !!
$im contient bien ton image, il faut maintenant l'enregistrer !
Avec la fonction imagejpeg($im, $fichier, 90) pour une qualité de 90%.

Et tu as juste à faire : imagefilledrectangle ($im, 300, 200, 500, 500, $red);
Pas la peine de mettre le code retour dans $x !
Titre: Upload D'images Jpg
Posté par: Mikado le 01 juillet 2003 à 13:00:24
Effectivement ça marche mieux maintenant...hélàs car mon fond de carte est foutu!
Ce que voudrais faire c'est charger un fond de carte et dessiner mes points sur une espèce de calque, ainsi mon fond serait toujours intact.
Est-ce possible?
Titre: Upload D'images Jpg
Posté par: spontex le 01 juillet 2003 à 13:27:35
Oui, bien sûr, c'est possible !

- Soit tu enregistres l'image modifiée sous un autre nom que l'image d'origine (genre $fichier."_modified"), comme ça tu conserves les deux

- Soit tu fais un nouveau script PHP dont le but est d'afficher cette image (et donc sans l'écrire dans un fichier). Pour cela, il te faut faire un deuxième script affiche_image.php qui se chargera juste de la production de l'image :

$fichier = stripslashes($fichier);
$extension = strtolower(substr($fichier, -3));
$im = imagecreatefromjpeg($fichier);
$in = fopen($fichier, "rb");
$size = getimagesize($fichier);
$large = $size[0];
$haut = $size[1];
$red = ImageColorAllocate($im, 255, 0, 0);
imagefilledrectangle ($im, 300, 200, 500, 500, $red);
imagejpeg($im) <-- tout seul, sans nom de fichier


et ton script principal devient :


 global $base,$bouton,$id,$fichier;
$x = "";
$x .= "<br><table align=left width='100%' border=0 bgcolor=#E4DCD2>";
$x .= "<tr><td align=center width='100%'> ";
$x .= "<p1>Fichier à télécharger :</p1><input name=\"fichier\" type=\"file\" value=\"\" size=\"50\">";
$x .= boutonImage ("./images/telech.jpg","boutonUpload", "23", "20");
$x .= "</td></tr>";

if($bouton == "boutonUpload")
{
$x .= "<tr><td><img src=\"affiche_image?fichier=".urlencode($fichier)."\" width=$large height=$haut></td></tr></table>";
}

return $x;


Voilà :-)
Titre: Upload D'images Jpg
Posté par: Mikado le 01 juillet 2003 à 16:47:36
En suivant scrupuleusement tes consignes voici ce que j'obtiens :

ÿØÿàJFIFÿþ>CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀd\"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?î7€.Òr ;ŒŽŸôÐýޔ¤1™N läðGñŸÝïÏñÐĀU˜±Ž[$íW¦î§Ë´ÜÆÓÞ9`“ÿÇþC®ãÂÇ̪Œg0í]˜#‘ÿ<óüAëÅH%3nvq‘&ÝÛ¾] ã‚ÿÝÇëMHG!ÉÈ ¢.................

What is this?

 
Titre: Upload D'images Jpg
Posté par: Corby le 01 juillet 2003 à 16:51:00
dans ton formulaire d'envoi ou tu as ton <input type=file tu doit mettre <form name="nomform" method="post" ENCTYPE="multipart/form-data> c'est le enctype qui determenie tout
Titre: Upload D'images Jpg
Posté par: spontex le 02 juillet 2003 à 11:26:19
Citer
En suivant scrupuleusement tes consignes voici ce que j'obtiens :

ÿØÿàJFIFÿþ>CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀd\"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?î7€.Òr ;ŒŽŸôÐýޔ¤1™N läðGñŸÝïÏñÐĀU˜±Ž[$íW¦î§Ë´ÜÆÓÞ9`“ÿÇþC®ãÂÇ̪Œg0í]˜#‘ÿ<óüAëÅH%3nvq‘&ÝÛ¾] ã‚ÿÝÇëMHG!ÉÈ ¢.................

What is this?
C'est une image JPEG !!

Ajoute cette commande :
Header("Content-type: image/jpeg");
Avant la commande imagejpeg(...)

Pour bien indiquer que c'est une image.
Et ajoute un :
imagedestroy($im);

A la fin, pour libérer la mémoire.
Titre: Upload D'images Jpg
Posté par: Mikado le 02 juillet 2003 à 13:00:29
Le calvaire continue :(

Voici une nouvelle vague d'erreurs :

Citer
Warning: imagecreatefromjpeg: Unable to open '' for reading in c:\program files\easyphp\www\bdd\affiche_image.php on line 4

Warning: fopen("", "rb") - No error in c:\program files\easyphp\www\bdd\affiche_image.php on line 5

Warning: getimagesize: Unable to open '' for reading. in c:\program files\easyphp\www\bdd\affiche_image.php on line 6

Warning: imagecolorallocate(): supplied argument is not a valid Image resource in c:\program files\easyphp\www\bdd\affiche_image.php on line 9

Warning: imagefilledrectangle(): supplied argument is not a valid Image resource in c:\program files\easyphp\www\bdd\affiche_image.php on line 10

Warning: Cannot add header information - headers already sent by (output started at c:\program files\easyphp\www\bdd\inc.php:23) in c:\program files\easyphp\www\bdd\affiche_image.php on line 11

Warning: imagejpeg(): supplied argument is not a valid Image resource in c:\program files\easyphp\www\bdd\affiche_image.php on line 12

Warning: imagedestroy(): supplied argument is not a valid Image resource in c:\program files\easyphp\www\bdd\affiche_image.php on line 13

Mon script principal :

function AppliActionWay()
{
   global $base,$bouton,$id,$fichier;
   $x = "";
   $x .= "<br><table align=left width='100%' border=0 bgcolor=#E4DCD2>";
   $x .= "<tr><td align=center width='100%'> ";
   $x .= "<p1>Fichier à télécharger :</p1><input name=\"fichier\" type=\"file\" value=\"\" size=\"50\">";
   $x .= boutonImage ("./images/telech.jpg","boutonUpload", "23", "20");
   $x .= "</td></tr>";
   include("affiche_image.php");
   if($bouton == "boutonUpload")
   {
   $x .= "<tr><td><img src=\"affiche_image?fichier=".urlencode($fichier)."\" width=$large height=$haut></td></tr></table>";
   }

   return $x;
}

Mon script d'affichage : affiche_image.php

<?php
$fichier = stripslashes($fichier);
$extension = strtolower(substr($fichier, -3));
$im = imagecreatefromjpeg($fichier);
$in = fopen($fichier, "rb");
$size = getimagesize($fichier);
$large = $size[0];
$haut = $size[1];
$red = ImageColorAllocate($im, 255, 0, 0);
imagefilledrectangle ($im, 300, 200, 500, 500, $red);
Header("Content-type: image/jpeg");
imagejpeg($im);
imagedestroy($im);
?>

Pour l'erreur de header, voici mon script inc.php

$utilisateur = "root";
$motdepasse  = "";
$base        = "mabase";
$serveur     = "localhost";

function db_connect()
{
        global $utilisateur, $motdepasse, $serveur;
        $connexion = mysql_connect($serveur, $utilisateur, $motdepasse);
        return $connexion;
}

?>

Je suis vraiment désolé Spontex de t'avoir embarqué dans cette galère :o  
Titre: Upload D'images Jpg
Posté par: spontex le 02 juillet 2003 à 14:14:59
Déjà, le script affiche_image marche, le problème se situe au niveau de l'upload :

http://dvdtoile.com/tmp/affiche_image?fich...08.LZZZZZZZ.jpg (http://dvdtoile.com/tmp/affiche_image?fichier=http://images-eu.amazon.com/images/P/B000070G7S.08.LZZZZZZZ.jpg)

Il te manque au moins un <form method='POST' enctype='multipart/form-data'> ... </form > si tu ne l'as pas déjà
Titre: Upload D'images Jpg
Posté par: Mikado le 02 juillet 2003 à 16:12:11
Le script corrigé :

function AppliActionWay()
{
   global $base,$bouton,$id,$fichier;
   $x = "";
   $x .= "<form action=\"\" method=\"post\" enctype=\"multipart/form-data\" name=\"spot\"> \n ";
   $x .= "<br><table align=left width='100%' border=0 bgcolor=#E4DCD2>";
   $x .= "<tr><td align=center width='100%'> ";
   $x .= "<p1>Fichier à télécharger :</p1><input name=\"fichier\" type=\"file\" value=\"\" size=\"50\">";
   $x .= boutonImage ("./images/telech.jpg","boutonUpload", "23", "20");
   $x .= "</td></tr>";
   include("affiche_image.php");
   if($bouton == "boutonUpload")
   {
   $x .= "<tr><td><img src=\"affiche_image?fichier=".urlencode($fichier)."\" width=$large height=$haut>";
   }
   $x .= "</td></tr></table></form>";
   return $x;
}

Mêmes erreurs...
Titre: Upload D'images Jpg
Posté par: spontex le 02 juillet 2003 à 16:32:21
Commence par virer cette ligne :

include("affiche_image.php");

Et aussi vire pour l'instant les informations width et height de la balise <img>
Titre: Upload D'images Jpg
Posté par: spontex le 02 juillet 2003 à 16:50:17
Pour terminer : affiche_image ne peut pas prendre directement en paramètre le fichier uploadé, car celui-ci a été placé dans un répertoire temporaire, et est effacé dès la fin du script d'interprétation du formulaire.
Il te faut donc utiliser move_uploaded_file.

Par exemple :

$x = "";
$x .= "<form action=\"\" method=\"post\" enctype=\"multipart/form-data\" name=\"spot\"> \n ";
$x .= "<br><table align=left width='100%' border=0 bgcolor=#E4DCD2>";
$x .= "<tr><td align=center width='100%'> ";
$x .= "<p1>Fichier à télécharger :</p1><input name=\"fichier\" type=\"file\" value=\"\" size=\"50\">";
$x .= "<input type='submit'>";
$x .= "</td></tr>";
if ($fichier_name != '')
{
move_uploaded_file($fichier, "./$fichier_name");
$x .= "<tr><td><img src=\"affiche_image?fichier=./$fichier_name\">";
}
$x .= "</td></tr></table></form>";

Le problème est ensuite l'effacement des fichiers .jpg ainsi copiés.

Tu peux par exemple faire ainsi :

$d = dir(".");
while ($entry = $d->read()) {
if (strtolower($entry, -3) == 'jpg' && time() - filemtime($entry) > 100)
  unlink($entry);
}

Ce qui efface les fichiers du répertoire courant vieux de plus de 100 secondes.

A+
Titre: Upload D'images Jpg
Posté par: Mikado le 02 juillet 2003 à 18:49:06
Le script modifié :

$x = "";
$x .= "<form action=\"\" method=\"post\" enctype=\"multipart/form-data\" name=\"spot\"> \n ";
$x .= "<br><table align=left width='100%' border=0 bgcolor=#E4DCD2>";
$x .= "<tr><td align=center width='100%'> ";
$x .= "<p1>Fichier à télécharger :</p1><input name=\"fichier\" type=\"file\" value=\"\" size=\"50\">";
$x .= "<input type='submit'>";
$x .= "</td></tr>";
   if ($fichier_name != '')
   {
   move_uploaded_file($fichier, "./$fichier_name");
   $x .= "<tr><td><img src=\"affiche_image?fichier=./$fichier_name\">";
   }
$x .= "</td></tr></table></form>";

...mêmes erreurs :(  
Titre: Upload D'images Jpg
Posté par: spontex le 02 juillet 2003 à 18:57:47
Regarde, ça marche nickel :

http://dvdtoile.com/tmp/test (http://dvdtoile.com/tmp/test)

avec ces fichiers (le $_FILES n'est qu'une façon plus propre de l'écrire, ça marche aussi comme tu l'as écrit)


test.php
<?
$x = "";
$x .= "<form action=\"\" method=\"post\" enctype=\"multipart/form-data\" name=\"spot\"> \n ";
$x .= "<br><table align=left width='100%' border=0 bgcolor=#E4DCD2>";
$x .= "<tr><td align=center width='100%'> ";
$x .= "<p1>Fichier à télécharger :</p1><input name=\"fichier\" type=\"file\" value=\"\" size=\"50\">";
$x .= "<input type='submit'>";
$x .= "</td></tr>";
if (is_uploaded_file($_FILES['fichier']['tmp_name']))
{
move_uploaded_file($_FILES['fichier']['tmp_name'], "./".$_FILES['fichier']['name']);
$x .= "<tr><td><img src=\"affiche_image?fichier=./".urlencode($_FILES['fichier']['name'])."\">";
}
$x .= "</td></tr></table></form>";

echo $x;
?>


affiche_image.php
<?php
$fichier = urldecode($fichier);
$extension = strtolower(substr($fichier, -3));
$im = imagecreatefromjpeg($fichier);
$in = fopen($fichier, "rb");
$size = getimagesize($fichier);
$large = $size[0];
$haut = $size[1];
$red = ImageColorAllocate($im, 255, 0, 0);
imagefilledrectangle ($im, 300, 200, 500, 500, $red);
Header("Content-type: image/jpeg");
imagejpeg($im);
imagedestroy($im);
?>
Titre: Upload D'images Jpg
Posté par: Mikado le 02 juillet 2003 à 22:48:50
Je confirme que ça marche chez toi.

J'ai trouvé la cause des erreurs, j'avais oublié un include("affiche_image.php") dans ma page index...:unsure:  

Voici ici http://www.carnetdepeche.com/bdd/go.php (http://www.carnetdepeche.com/bdd/go.php) ce que ça donne sur le #2 de Phpnet.
Ton identification : spontex/spontex
Clic sur Mes données puis sur W.

Tu constateras qu'il y a une redirection vers la case départ...et aucune erreur affichée.  
Titre: Upload D'images Jpg
Posté par: spontex le 02 juillet 2003 à 23:12:35
Horreur, des frames ! Qu'est-ce que c'est moche, les frames ! C'est à proscrire, aussi.
Le problème est que dans ton form tu as mis action="" ce qui signifie que la page "résultat" est la page courante... donc go.php. Il faut que comme action, tu mettes la page de "résultat".

Mais vire tous ces frames, c'est mauvais ! Impossible de bookmarker les pages, de voir l'adresse de la page où l'on est, etc. etc. On faisait ça il y a 5 ans, maintenant, avec PHP et CSS, c'est un peu moisi !

Idem pour le Javascript... à proscrire, ça complique tout !!
Titre: Upload D'images Jpg
Posté par: Mikado le 02 juillet 2003 à 23:39:17
Ce que tu ne sais pas, c'est que j'utilise un canevas qui me permet de créer mes pages dynamiquement.
Au départ, j'ai une seule page html (go.php) qui contient dans son body un appel à la fonction main() que voici:

function main()
{
  global $pagecourante, $idsession, $bouton, $login, $pwd, $actioncourante ;
  $pagecourante = "go";

  $x = SessionTraiter();
  if ($idsession > 0)
  {
    // le début du seul formulaire qui englobe toutes les pages
    $x .= "<form action=\"$pagecourante.php\" method=post ";
    $x .= "name=form$pagecourante target=\"_self\"> \n ";
    // le champ "bouton" est placé (caché) en premier dans tous les formulaires
    $x .= " <input type=hidden name='bouton' value=\"$bouton\"> \n";

    $x .= AppliActionCalculer();
    $x .= AppliConstruire();
   
    // les champs cachés à placer en dernier dans le formulaire
    $x .= "<input type=hidden name='idsession' value=\"$idsession\"> \n";
    $x .= "<input type=hidden name='actioncourante' value=\"$actioncourante\"> \n";
    $x .= "<input type=hidden name='codeaide' value=\"$codeaide\"> \n";
    $x .= "</form> \n ";
  }
  printf ("%s", $x);
}
?>

Le main est exécuté lors de chaque clic sur un submit. Je crois que le pb vient de là...
Qu'en penses-tu?
Titre: Upload D'images Jpg
Posté par: Corby le 03 juillet 2003 à 09:09:53
ya pas de enctype="multipart/form-data" dans le formulaire de ta fonction main
Titre: Upload D'images Jpg
Posté par: Mikado le 03 juillet 2003 à 09:38:38
Exact mais dans cette appli je télécharge aussi des fichiers txt.
Si j'ajoute enctype="multipart/form-data" dans main, ça ne va pas mettre le souk?
Titre: Upload D'images Jpg
Posté par: Mikado le 03 juillet 2003 à 10:37:44
Je viens de tester l'upload et la lecture d'un fichier txt...ça ne marche plus avec le multipart :(  et ça remarche si je l'enlève...
Titre: Upload D'images Jpg
Posté par: spontex le 03 juillet 2003 à 10:50:03
Citer
Ce que tu ne sais pas, c'est que j'utilise un canevas qui me permet de créer mes pages dynamiquement.
Au départ, j'ai une seule page html (go.php) qui contient dans son body un appel à la fonction main() que voici

Le main est exécuté lors de chaque clic sur un submit. Je crois que le pb vient de là...
Qu'en penses-tu?
Je pense que c'est très mauvais et assez illisible :-)
En tout cas, il faut que l'action du form d'upload renvoie sur la partie de code qui va traiter le formulaire, et ça ne doit pas être le cas actuellement.
Si tu veux faire passer des choses à ta page go.php, tu peux mettre des champs de type hidden dans ton form d'upload, afin de retrouver des infos si nécessaire.

A présent, ce n'est plus un problème de PHP et d'upload, c'est un problème de HTML et de conception de ton site... je ne l'approuve pas du tout, car je la trouve difficile à maintenir, et car elle peut poser des problèmes de différenciation des pages comme celui que tu rencontres à présent.

A++
Titre: Upload D'images Jpg
Posté par: Mikado le 03 juillet 2003 à 11:48:07
OK...merci à toi et à Corby d'avoir consacré du temps à essayer de résoudre mon pb.
Je vais voir si je peux changer mon fusil d'épaule.
A bientôt pour d'autres aventures :rolleyes:  
Titre: Upload D'images Jpg
Posté par: spontex le 03 juillet 2003 à 12:13:23
Citer
OK...merci à toi et à Corby d'avoir consacré du temps à essayer de résoudre mon pb.
Je vais voir si je peux changer mon fusil d'épaule.
A bientôt pour d'autres aventures :rolleyes:
Essaye quand même ton script d'upload avec des pages "saines", toutes simples, qui ne contiennent que ça, pour s'assurer qu'il fait bien ce que tu veux :-)
Titre: Upload D'images Jpg
Posté par: Mikado le 03 juillet 2003 à 16:25:10
J'ai suivi ton conseil, voici le test que je viens de faire :

Ma page test.php :
<html>
<head>
<TITLE>essai</TITLE>
</head>
<body>
<?
$x = "";
$x .= "<table><tr><td>";
$x .= "<form action=\"\" method=\"post\" enctype=\"multipart/form-data\" name=\"spot\"> \n ";
$x .= "Fichier à télécharger :<input name=\"fichier\" type=\"file\" value=\"\" size=\"50\">";
$x .= "<input type='submit'></td></tr>";
if (is_uploaded_file($_FILES['fichier']['tmp_name']))
{
move_uploaded_file($_FILES['fichier']['tmp_name'], "./".$_FILES['fichier']['name']);
$x .= "<tr><td><img src=\"affiche_image?fichier=./".urlencode($_FILES['fichier']['name'])."\">";
}
$x .= "</td></tr></form></table>";
echo $x;
?>
</body>
</html>

Mon fichier affiche_image.php :
<?php
$fichier = urldecode($fichier);
$im = imagecreatefromjpeg($fichier);
$red = ImageColorAllocate($im, 255, 0, 0);
imagefilledrectangle ($im, 50, 50, 150, 150, $red);
Header("Content-type: image/jpeg");
imagejpeg($im);
imagedestroy($im);
?>

Résultat :
- l'image n'est pas affichée
- le déplacement de fichier fonctionne
- le rectangle rouge n'apparaît pas sur l'image déplacée

Je suis désespéré...et désespérant je sais...
Titre: Upload D'images Jpg
Posté par: Mikado le 04 juillet 2003 à 13:35:27
Si quelqu'un a une piste...
Titre: Upload D'images Jpg
Posté par: spontex le 04 juillet 2003 à 16:02:05
PTDR je viens de voir ton image lesboeufs.jpg sur mon site :-)))

Bon voilà le code, qui marche :

test.php : <?
$x = "";
$x .= "<form action=\"\" method=\"post\" enctype=\"multipart/form-data\" name=\"spot\"> \n ";
$x .= "<br><table align=left width='100%' border=0 bgcolor=#E4DCD2>";
$x .= "<tr><td align=center width='100%'> ";
$x .= "<p1>Fichier à télécharger :</p1><input name=\"fichier\" type=\"file\" value=\"\" size=\"50\">";
$x .= "<input type='submit'>";
$x .= "</td></tr>";
if (is_uploaded_file($_FILES['fichier']['tmp_name']))
{
move_uploaded_file($_FILES['fichier']['tmp_name'], "./".$_FILES['fichier']['name']);
$x .= "<tr><td><img src=\"affiche_image?fichier=./$fichier_name\">";
}
$x .= "</td></tr></table></form>";

echo $x;
?>


affiche_image.php<?php
$fichier = urldecode($fichier);
$im = imagecreatefromjpeg($fichier);
$red = ImageColorAllocate($im, 255, 0, 0);
imagefilledrectangle ($im, 300, 200, 500, 500, $red);
Header("Content-type: image/jpeg");
imagejpeg($im);
imagedestroy($im);
?>
Titre: Upload D'images Jpg
Posté par: Mikado le 07 juillet 2003 à 12:54:34
J'ai un peu avancé... :unsure:

1 - ton script marche seulement si j'ajoute l'extension php à l'endroit suivant :

Citer
$x .= "<tr><td><img src=\"affiche_image.php?fichier=./$fichier_name\">";

2 - la taille du rectangle est respectée
3 - par contre la couleur du rectangle est aléatoire, selon l'image uploadée j'obtiens du rouge, du noir, du bleu clair ou du bleu foncé. J'ai l'impression que ça dépend de la couleur d'arrière plan. Cette anomalie a été également constatée par un ami auquel j'ai demandé de faire le test.

Que faut-il en conclure?
 
Titre: Upload D'images Jpg
Posté par: spontex le 07 juillet 2003 à 16:57:14
Salut,

Je pense qu'il y a une erreur dans ton script, car j'obtiens toujours du rouge, enfin sur les quelques image que j'ai testées... c'est peut-être dû au fait que l'image que tu uploades n'est pas en true color non ?
Si c'est le cas, peut-être te faut-il utiliser la fonction imagecreatetruecolor() pour faire une belle image, puis copier dessus ton image uploadée...
Titre: Upload D'images Jpg
Posté par: Mikado le 08 juillet 2003 à 11:39:27
Les images que j'utilise sont des scans de cartes IGN. Comment savoir s'il s'agit de couleurs "vraies"?
J'ai créé une image noire avec imagecreatetruecolor($large,$haut) mais je ne sais pas y coller mon image uploadée...
Titre: Upload D'images Jpg
Posté par: spontex le 08 juillet 2003 à 12:05:03
Une copy se fait avec la fonction imagecopy, de mémoire. Regarde la doc, il y a des exemples.

Bon courage :-)