Pb pour joindre fichier a formulaire HTML
Rook -
Je suis débutant en HTML. Je viens de faire un site et dans ma page contact j'ai fait un formulaire.
J'ai mis la possibilité au client de me joindre un fichier, le problème c'est que je le recois pas ! comment ca se fait ?
Merci!
Voici mon formulaire :
<FORM enctype="multipart/form-data" action="mailto:blablabla@blablavla.fr" method="post">
<FIELDSET STYLE="background: #FFFFDD ;">
<LEGEND STYLE="background: #E5F5EE ;" <b>Complément de demande :</b></LEGEND>
<TABLE BORDER="0" CELLSPACING="2" CELLPADDING="10" WIDTH="95%">
<TR>
<TD WIDTH="70%">
Précisions ou informations concerantn votre demande :<br>
<textarea name="Autres" cols="100" rows="3"></textarea><br>
<br>
Nous joindre un fichier (Plans, photo...) :
<input name=fichier type=file />
</TABLE>
</FIELDSET><br><br>
<CENTER><TABLE BORDER="0" CELLSPACING="0" CELLPADDING="10" WIDTH="95%">
<TR><TH>
<INPUT TYPE=SUBMIT VALUE=" Soumettre formulaire "> <INPUT TYPE=RESET VALUE=" Effacer ">
</TABLE></CENTER>
</FORM>
- Pb pour joindre fichier a formulaire HTML
- Whatsapp formulaire opposition - Guide
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
48 réponses
L’utilisation d’un formulaire avec enctype="multipart/form-data" et action="mailto:…" est peu fiable pour recevoir des fichiers joints et nécessite un traitement côté serveur pour gérer l’envoi des pièces jointes.
La solution consiste à remplacer l’action par un script PHP (par exemple mail4.php) qui reçoit le fichier via $_FILES['fichier'], le déplace sur le serveur et construit un message MIME avec pièce jointe avant d’envoyer l’e-mail au destinataire.
En test local, il faut vérifier les chemins (mail3.php vers mail4.php), s’assurer que les balises HTML sont correctement fermées, et configurer un serveur SMTP accessible pour que mail() fonctionne (par exemple via EasyPHP).
Une fois le script en place et le serveur SMTP opérationnel, l’attache peut être reçue, en veillant à renseigner l’adresse du destinataire dans mail4.php.
Bon sinon chez moi ca marche pas ca m'envois même plus sur mail4.php...Il me dit que le fichier est introuvable.
Mon repertoire est celui là :
http://localhost/FormEnvoiMail/
Dedant il y a les fichiers mail3.php et mail4.php
Je clique sur mail3.php qui s'ouvre, je fais "soumettre" et la ca va sur une page d'erreur en me disant que le fichier est inexistant (il va sur l'adresse suivante : http://localhost/FormEnvoiMail/mail4.php
Deuxiemement, comment il peut m'envoyer un email puisque j'ai pas mis mon adresse mail dedant ???
MERCI
Je ne peux rien te dire de plus, si ça tourne chez moi, il n'y a aucune raison que ça ne fonctionne pas chez toi. Tu as une erreur dans le chemin du fichier apparemment. mail4.php doit bien se trouver dans le même répertoire que mail3.php et si tu n'as pas modifié le script ça devrait fonctionner.
Ah ben si tu n'as pas précisé ton adresse dans le script au bon endroit, c sur que ça fonctionnera pas ; mais avant tu devras modifier une ligne de php.ini, un fichier de configuration pour renseigner ton serveur SMTP, mais on en est pas là...
Pour préciser ton adresse, modifie la ligne:
$destinataire = "toto@tata.fr";
Pour débugguer un programme, il faut y aller pas à pas, on ne peut pas tout faire en même temps, donc 1ère étape: il faut réparer l'erreur que tu rencontres là.
C'est dommage, on est très près du but.
1- Je crée un répertoire "form" dans C:\Program Files\EasyPHP1-8\www\
2- je crée un nouveau fichier texte que je nomme mail3.php
2 bis - je crée un nouveau fichier texte que je nomme mail4.php
3 - j'ouvre le premier fichier et je recopie le code suivant:
<FORM enctype="multipart/form-data" action="./mail4.php" method="post">
<FIELDSET STYLE="background: #FFFFDD ;">
<LEGEND STYLE="background: #E5F5EE ;" <b>Complément de demande :</b></LEGEND>
<TABLE BORDER="0" CELLSPACING="2" CELLPADDING="10" WIDTH="95%">
<TR>
<TD WIDTH="70%">Précisions ou informations concernant votre demande :<br>
<textarea name="Autres" cols="100" rows="3"></textarea>
<br><br>Nous joindre un fichier (Plans, photo...) :
<input type="file" name="fichier" />
</TD>
</TR>
</TABLE>
</FIELDSET><br><br>
<CENTER>
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="10" WIDTH="95%">
<TR>
<TH>
<INPUT TYPE="SUBMIT" VALUE=" Soumettre formulaire ">
<INPUT TYPE="RESET" VALUE=" Effacer ">
</TH>
</TR>
</TABLE>
</CENTER>
</FORM>
3bis - j'ouvre le second fichier et je recopie le code suivant:
<html>
<body>
<center>
<?
$name_file = $_FILES['fichier']['name'];
$source=$_FILES['fichier']['tmp_name'];
move_uploaded_file($source, "./".$name_file);
$extension=get_extension($name_file);
$type="text/plain";
if($type=="doc")
{
$type="text/vnd.ms-word";
}
else if($type=="xls")
{
$type="text/vnd.ms-excel";
}
$type2="image/png";
if($extension=="gif")
{
$type2="image/gif";
}
else if($extension=="bmp")
{
$type2="image/bmp";
}
function get_extension($filename)
{
$parts = explode('.',$filename);
$last = count($parts) - 1;
$ext = $parts[$last];
return $ext;
}
//----------------------------------
// Construction de l'entête
//----------------------------------
$boundary = "-----=".md5(uniqid(rand()));
$header = "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
$header .= "\r\n";
$msg = "Je vous informe que ceci est un message au format MIME 1.0 multipart/mixed.\r\n";
$msg .= "--$boundary\r\n";
$msg .= "Content-Type: $type; charset=\"iso-8859-1\"\r\n";
$msg .= "Content-Transfer-Encoding:8bit\r\n";
$msg .= "\r\n";
$msg .= $_POST['Autres'];
$msg .= "\r\n";
if($name_file!="")
{
$file = $name_file;
$fp = fopen($file, "rb");
$attachment = fread($fp, filesize($file));
fclose($fp);
$attachment = chunk_split(base64_encode($attachment));
$msg .= "--$boundary\r\n";
$msg .= "Content-Type: $type2; name=\"$file\"\r\n";
$msg .= "Content-Transfer-Encoding: base64\r\n";
$msg .= "Content-Disposition: inline; filename=\"$file\"\r\n";
$msg .= "\r\n";
$msg .= $attachment . "\r\n";
$msg .= "\r\n\r\n";
$msg .= "--$boundary--\r\n";
}
$destinataire = "toto@tata.fr";
mail($destinataire, "le sujet", $msg, $header);
if($name_file!="")
{
unlink($name_file);
}
print("<br>\n");
print("<br><A href=./mail3.php target=\"principal\"><font size=\"2\">Envoyer un autre mail</font></A>");
?>
</center>
</body>
</html>
4- j'ouvre EasyPhp, je fais clic droit sur l'icône en bas à droite de l'écran<<Administration<<dans le menu "Apache", je clic sur Ajouter
4 bis- je renseigne un alias et le chemin du répertoire qui est: C:\Program Files\EasyPHP1-8\www\form
4 ter- je valide
5- je redémarre EasyPhp (clic droit sur l'icône<<Redémarrer)
6- clic droit<<Administration, je clic sur le nom de l'alias, puis sur mail3.php
Résultat: j'ai l'erreur suivante:
Warning: mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in c:\program files\easyphp1-8\www\formu\mail4.php on line 83
qui est tout à fait normale car je n'ai pas renseigné de SMTP dans php.ini
Normalement tu devrais obtenir la même erreur si tu suis les mêmes étapes!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionQuel couillon je suis !!!
tu sais quoi ? quand j'ai enregistré les fichiers via notepad++ je selectionnais ds la liste l extension(PHP) et je nomais le fichier mail3
Or il fallait mettre mail3.php !!!
Je suis vraiement dslé on a perdu du temps a cause de ma stupidité !!!
Bref j'ai corrigé et voila les message d erreur que j ai après avoir soumis un fichier ds mail3.php
Warning: fopen(ban_web-762452.png): failed to open stream: No such file or directory in c:\program files\easyphp1-8\www\formenvoimail\mail4.php on line 64
Warning: filesize(): Stat failed for ban_web-762452.png (errno=2 - No such file or directory) in c:\program files\easyphp1-8\www\formenvoimail\mail4.php on line 65
Warning: fread(): supplied argument is not a valid stream resource in c:\program files\easyphp1-8\www\formenvoimail\mail4.php on line 65
Warning: fclose(): supplied argument is not a valid stream resource in c:\program files\easyphp1-8\www\formenvoimail\mail4.php on line 66
Warning: mail(): SMTP server response: 550 5.7.1 Unable to relay for toto@tata.fr in c:\program files\easyphp1-8\www\formenvoimail\mail4.php on line 83
Warning: unlink(ban_web-762452.png): No such file or directory in c:\program files\easyphp1-8\www\formenvoimail\mail4.php on line 87
$destinataire = "toto@tata.fr";et renseigne ton adresse mail.
Alors j ai changer la ligne du mail et mis mon adresse (j'ai mis la bonne adresse mail mais pour ici pour j'utiliserai blabla@bla.fr)
voici la ligne d'erreur que j obtiens maintenant
Warning: mail(): SMTP server response: 550 5.7.1 Unable to relay for blabla@bla.fr in c:\program files\easyphp1-8\www\formenvoimail\mail4.php on line 83
mail($destinataire, "le sujet", $msg, $header);
On va aller modifier une ligne de php.ini: dans C:\Program Files\EasyPHP1-8\apache, tu ouvre le fichier "php.ini"
Fais une recherche sur "SMTP", est-ce que tu obtiens un résultat?
Dans l'affirmative, tu modifie les 2 lignes qui ressemblent à:
SMTP = smtp.tata.fr sendmail_from = toto@tata.fren renseignant ton FAI et ton adresse mel.
J'ai refais un test mais j'obtiens toujours la mm ligne d erreur :
Warning: mail(): SMTP server response: 550 5.7.1 Unable to relay for monmail@monfai.fr in c:\program files\easyphp1-8\www\formenvoimail\mail4.php on line 83
C bon !!!!
En fait j'avais pas redemarré les serveurs easyphp et la j ai reessayé et ca marche j ai recu ENFIN (lol) un mail avec mon fichier !
ALORS Maintenant on va ameliorer ca, car comme je t'ai expliqué le code doit normalement apparaitre a l interieur du logiciel et non par des pages en + car là du coup l'utilisation lorsqu'il va cliquer sur ma ribrique "contact" ca va le diriger vers notre fichier (mail3.php ds notre exemple) et donc il n'est plus dans mon site...(pas de baniere, pas le menu sur la gauche etc...)
Le soucis c'est que dans ton script tu fais appel à une page, en l'occurence mail4.php faudrai que je trouve une astuce pour que ca fasse plutot appel à un autre script.
Grosso modo dans la page de ma rubrique, par exemple la rubrique "contact" je peux entrer directeemnt du texte ou faire appel à un scipt en mettant dans ma page %MAIL3% qui fait appel à une base de données dite "editeur de champs", ici donc au champ "MAIL3" et ce champ je l'ai renseigné en mettant ton code (le code ds mail3.php).
Si tu as le temps, telecharge la demo c pas lourd et tu le desinstalle apres tu vas vite comprendre ce que je veux dire :
https://www.01net.com/telecharger/windows/Internet/editeur_de_site/fiches/50235.html
https://www.lauyan.com/fr/forms.html
Et dsl pas le temps de regarder le fonctionnement de ce logiciel cette semaine.
J'ai mis tout mon site dans le repertoire "www" d'easyphp, et ca marche, j'ai du changer par contre mail3.php par index.php dans le code de mail4.php comme ca ca renvois directement à ma page "contact" du site et ca marche, je recois bien les emails et tout.
En revanche, la page mail4.php ("envoyer un autre email") reste sur l'ordi... Je prefererai qu'elle disparaisse (se ferme) lorsqu'on clique sur le lien "envoyer un autre email" comme ca je mettrai à la place "Merci pour vos informations, nous traiterons votre demande dans les meilleurs delais" "cliquez ici pour retourner sur le site"
OU carement, la page s'affiche genre 2 ou 3 secondes avec le message comme quoi je remercie les clients et apres redirection vers la page d'acceuil du site mais bon je pense que c trop compliqué ca...
Qu'en penses-tu ?
PS : ca plante qd je joins d autre extensions que .PNG je suppose que je dois lister ttes les extensions qui existent et rajouter ds le code ?
MERCI
print("<br><A href=./mail3.php target=\"principal\"><font size=\"2\">Envoyer un autre mail</font></A>");
à la fin de mail4.php, par exemple:
print("<br><A href=./index.php target=\"principal\"><font size=\"2\">Retour à la page d'accueil</font></A>");
Ainsi tu reviens à la page "index.php", mais je crois que c'est ce que tu as fait, j'ai pas tout suivi.
Tu peux revenir sur la page que tu veux par un clic, il suffit de modifier:
A href=./index.phpet de mettre le nom de la page que tu veux afficher.
Pour le type de fichier pris en compte, j'ai précisé plus haut que toutes les extensions ne sont pas acceptées avec ce programme ; seuls les .doc, .xls, .png, .gif, .bmp passent je crois, peut-être les .txt aussi (je ne peux pas tester là).
C'est la partie suivante du code qui veut ça:
$extension=get_extension($name_file);
$type="text/plain";
if($type=="doc")
{
$type="text/vnd.ms-word";
}
else if($type=="xls")
{
$type="text/vnd.ms-excel";
}
$type2="image/png";
if($extension=="gif")
{
$type2="image/gif";
}
else if($extension=="bmp")
{
$type2="image/bmp";
}
Franchement merci t'es trop balaise !!!
bon il me reste plus qu'a rajouter les extensions .pdf .jpg .jpeg .tiff car mes clients vont m'envoyer ou les plans de leur maison oudes photos...
Euh puis-je abuser ? c possible qu'ils envoient plusieurs fichiers en mm temps ? genre 3 maxi...
Si c long ou si c compliqué t'embete pas avec ca...
enfin je dirai que je recois bien les mails avec les fichiers mais ya tjrs des messages "warning" et "notice" sur mail4.php comme ca :
(la j'ai envoyer un fichier .xls)
"Notice: Undefined variable: type2 in c:\program files\easyphp1-8\www\actu\topic4\mail4.php on line 73"
"envoyer un autre email"
J'avais essayé d'envoyer un .doc et je n'avais pas de message d'erreur. G pas essayé le .xls mais si il n'y a pas d'erreur avec un doc, il devrait pas y en avoir avec xls, c'est bizarre.
Pour prendre en compte les jpg, jpeg et tiff, essaye d'ajouter après:
$type2="image/png";
if($extension=="gif")
{
$type2="image/gif";
}
else if($extension=="bmp")
{
$type2="image/bmp";
}ceci:
else if($extension=="jpg")
{
$type2="image/jpg";
}
else if($extension=="jpeg")
{
$type2="image/jpeg";
}
else if($extension=="tiff")
{
$type2="image/tiff";
}
mais je ne suis pas certaine que ça fonctionne.
Pour prendre en compte le .pdf, j'avoue que je sèche, je vais chercher un peu et je testerai ça ce soir :o)
Enfin, pour avoir la possiblité d'envoyer 3 pièces jointes, c pas sorcier ; il faut ajouter dans le index.php en dessous de:
<input type="file" name="fichier" />
ceci:
<input type="file" name="fichier2" /> <input type="file" name="fichier3" />
si ça te va comme présentation, puis modifier le mail4.php, mais je verrai ça ce soir :o)
Juste regarde, la fameuse ligne que tu m as demandé de modifier,
print("<br><A href=./index.php target=\"principal\"><font size=\"2\">Retour à la page d'accueil</font></A>");
elle me renvoie sur l'index du formaulaire or je voudrai qu elle me renvoit sur l index du site (localhost/actu/accueil/index.html)
j'ai mis ds tous les sens mais j ai pas eu de bol, toi a mon avis tu vas savoir de suite ou je renseigne ca ! lol
;o)
Pour le chemin du répertoire, il faudrait que tu me dise dans quel répertoire se situe mail4.php à partir de localhost. Si il est dans localhost/formulaire/ (ou dans tout autre répertoire directement dans localhost/), alors il faut écrire:
A href=../actu/accueil/index.htmlpour atteindre cette page.
Le "../" signifie "remonte d'un cran dans l'arborescence.
lol
L'attribut "target", tu peux l'enlever, il ne sert à rien ici.
Il permet de cibler un cadre lorsque l'on met en place des Frames, càd d'afficher la source spécifiée dans le lien dans un cadre donné:
<A href=./mail3.php target=\"principal\"><font size=\"2\">Envoyer un autre mail</font></A>
Le programmeur initial avait un jeu de Frames dont l'une s'appellait "principal" et il voulait afficher le contenu de "mail3.php" dans ce cadre lors d'un clic sur le lien.
2) Ca retourne bien sur la page d'acceuil mais la page mail4.php reste toujours ouverte
3) La page d acceuil s ouvre mais en petite fenetre qu il fo agrandir, on peut pas faire en sorte qu elle s agrandisse plein ecran direct ? lol
Je sais j'en demande tjrs trop :o)
Par contre j'ai toujours ces messages bizarre quand la page mail4.php apparait :
Notice: Undefined index: fichier in c:\program files\easyphp1-8\www\actu\topic4\mail4.php on line 6
Notice: Undefined index: fichier in c:\program files\easyphp1-8\www\actu\topic4\mail4.php on line 7
Notice: Undefined index: Autres in c:\program files\easyphp1-8\www\actu\topic4\mail4.php on line 70
Retour à la page d'accueil
C'est pas toujours les mm messages selon le fichier que je joins ou que je joins pas...
Ca veut dire quoi ?
Je suis allé dans le ligne qu'il dit a savoir les ligne 6 7 et 70 du fichier mail4.php normalement c'est ces lignes :
Line 6 : $name_file = $_FILES['fichier']['name'];
Line 7 : $source=$_FILES['fichier']['tmp_name'];
Line 70 : $msg .= $_POST['Autres'];