Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Formulaires
Formulaires Forum d'entraide sur les formulaires avec PHP. Avant de poster -> FAQ formulaires, Cours de formulaires et Sources de formulaires
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/12/2012, 17h27   #1
ThufirHawat
Invité de passage
 
Inscription : mars 2004
Messages : 23
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 23
Points : 3
Points : 3
Par défaut Pièce jointe dans un formulaire, encore et toujours

Bonjour à tous,

Je retape actuellement un site qui contient une page contenant un formulaire incluant l'ajout d'une pièce jointe.

J'ai cherché sur Internet pendant des heures, trouvant diverses pages me proposant des solutions que j'ai tenté d'adapter à mes besoins, mais je n'y parvient simplement pas.

j'ai notamment trouvé cette page : http://a-pellegrini.developpez.com/t...php/mail/#L3.4
que je l'ai transformé en :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
<?
 
// Récupération des information du formulaire
 
$to = 'adresse-du-destinataire@domaine.com';
$name = $_POST['name'];
$from = $_POST['from'];
$tel = $_POST['tel'];
$object = $_POST['object'];
$contenu = $_POST['contenu'];
 
// clé aléatoire de limite
$boundary = md5(uniqid(microtime(), TRUE));
 
// Headers
$headers = 'From: '.$from."\r\n";
$headers .= 'Mime-Version: 1.0'."\r\n";
$headers .= 'Content-Type: multipart/mixed;boundary='.$boundary."\r\n";
$headers .= "\r\n";
 
// Message HTML
$msg  = '--'.$boundary."\r\n";
$msg .= 'Content-type: text/html; charset=\"iso-8859-1\"'."\r\n\r\n";
$msg .= 'Nom : '.$name."<br>";
$msg .= 'Tél : '.$tel."<br><br>";
$msg .= $contenu."\r\n";
 
// Pièce jointe 1
$file_name = $_FILES['piece_jointe'];
if (file_exists($file_name))
{
	$file_type = filetype($file_name);
	$file_size = filesize($file_name);
 
	$handle = fopen($file_name, 'r') or die('File '.$file_name.'can t be open');
	$content = fread($handle, $file_size);
	$content = chunk_split(base64_encode($content));
	$f = fclose($handle);
 
	$msg .= '--'.$boundary."\r\n";
	$msg .= 'Content-type:'.$file_type.';name='.$file_name."\r\n";
	$msg .= 'Content-transfer-encoding:base64'."\r\n\r\n";
	$msg .= $content."\r\n";
}
 
// Fin
$msg .= '--'.$boundary."\r\n";
 
// Function mail()
mail($to, $object, $msg, $headers);
Et voici mon formulaire :

Code :
1
2
3
4
5
6
7
8
9
10
 
<form id='soumission' method="post" enctype="multipart/form-data" action="<?php echo( $_SERVER['REQUEST_URI'] ); ?>">  
<label for="name">Votre nom</label><input type="text" name="name" id="name" size="25" value="<?php echo( $name ); ?>" />
<label for="mail">Votre adresse mail</label><input type="text" name="from" id="from" size="25" value="<?php echo( $from ); ?>" /> 
<label for="tel">Votre téléphone</label><input type="text" name="tel" id="tel" size="25" value="<?php echo( $tel ); ?>" />
<label for="object">Objet</label><input type="text" name="object" id="object" size="25" value="<?php echo( $object ); ?>" />
<label for="contenu">Message</label><textarea name="contenu" id="contenu" rows="10" cols="70"><?php echo( $contenu ); ?></textarea>
<label for="fichier">Piece jointe</label><input type="file" name="piece_jointe" id="piece_jointe" />
<input type="reset" name="reset" value="Effacer" /><input type="submit" name="send" value="Envoyer" />
</form>
Mais cela ne fonctionne pas. Le mail est bien envoyé avec toutes les données, mais la pièce jointe n'apparaît pas. Pourriez-vous m'aider à trouver mon/mes erreur(s) et me dire ce que je dois modifier pour que le formulaire fonctionne pour l'envoie de fichiers (.doc, .pdf ou autre).

D'avance un grand merci de votre aide

Thufir Hawat
ThufirHawat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2012, 14h42   #2
ThufirHawat
Invité de passage
 
Inscription : mars 2004
Messages : 23
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 23
Points : 3
Points : 3
Re Bonjour,

Ayant continué à creuser la question j'ai fait quelques modifications en me basant sur ce code

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
$headers = 'From: '.$email;
 
		$content .= 'Le texte de mon message (en html si je veux)';
 
		if ($_FILES["fichier"]["name"] != null) {
 
			$fileatt = $_FILES['fichier']['tmp_name'];
			$fileatt_type = $_FILES['fichier']['type'];
			$fileatt_name = $_FILES['fichier']['name'];
 
			if (is_uploaded_file($fileatt)) {
				// Read the file to be attached
				$file = fopen($fileatt,'rb');
				$data = fread($file,filesize($fileatt));
				fclose($file);
 
				// Generate a boundary string
				$semi_rand = md5(time());
				$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
 
				// Add the headers for a file attachment
				$headers .= "\nMIME-Version: 1.0\n" .
						"Content-Type: multipart/mixed;\n" .
						" boundary=\"{$mime_boundary}\"";
 
				// Add a multipart boundary above the plain message
				$msg = "--{$mime_boundary}\n" .
					"Content-Type: text/html; charset=\"iso-8859-1\"\n" .
					"Content-Transfer-Encoding: 7bit\n\n" .
					$content . "\n\n";
 
				// Base64 encode the file data
				$data = chunk_split(base64_encode($data));
 
				// Add file attachment to the message
				$msg .= "--{$mime_boundary}\n" .
					"Content-Type: {$fileatt_type};\n" .
					" name=\"{$fileatt_name}\"\n" .
					"Content-Disposition: inline;\n" .
					" filename=\"{$fileatt_name}\"\n" .
					"Content-Transfer-Encoding: base64\n\n" .
					$data . "\n\n" .
					"--{$mime_boundary}--\n";
				$messageEnvoye = mail($_GET['email'],$objet,$msg,$headers);
			} else {
				// Fichier trop gros => gerer erreur
			}
		} else {
			$headers ='MIME-Version: 1.0' . "\n";
			$headers .= 'Content-type: text/html; charset=ISO-8859-1'."\n";
			$headers .= 'From: '.$email."\n";
			$headers .= "\n";
			$messageEnvoye = mail($_GET['email'],$objet,$content,$headers);
		}
que j'ai trouvé ici : http://forum.ovh.com/showthread.php?t=11748

Je l'ai adapté à ma sauce et j'ai découvert que le problème se situait au niveau de la fonction is_uploaded_file() qui renvoie systématiquement FALSE. Problème de taille du fichier ? (pourtant je fais des tests avec un fichier .jpg très léger). J'espère que ces précisions pourront vous permettre de m'aider à résoudre mon problème.

Thufir Hawat
ThufirHawat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2012, 19h29   #3
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 514
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 514
Points : 21 351
Points : 21 351
Controle ce que contient ton $_FILES.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2012, 00h13   #4
ThufirHawat
Invité de passage
 
Inscription : mars 2004
Messages : 23
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 23
Points : 3
Points : 3
Par défaut suite

J'ai fait un var_dump sur mon $_FILES et j'obtiens les infos suivante :

array(5) { ["name"]=> string(11) "fichier.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(14) "/tmp/phpnDid08" ["error"]=> int(0) ["size"]=> int(39367) }

Désormais je reçois le mail mais sous une forme étrange :

Citation:
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="==Multipart_Boundary_x2b3474332a0bfa968867800e49e9ba8cx"

--==Multipart_Boundary_x2b3474332a0bfa968867800e49e9ba8cx
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

יייייייי

--==Multipart_Boundary_x2b3474332a0bfa968867800e49e9ba8cx
Content-Type: image/jpeg;
name="fichier.jpg"
Content-Disposition: inline;
filename="fichier.jpg"
Content-Transfer-Encoding: base64

/9j/4RcaRXhpZgAASUkqAAgAAAAPAAABAwABAAAAAAgAAAEBAwABAAAAAAYAAAIBAwADAAAAwgAA
AAYBAwABAAAAAgAAAA8BAgAGAAAAyAAAABABAgAEAAAARTcxABIBAwABAAAAAQAAABUBAwABAAAA
AwAAABoBBQABAAAAzgAAABsBBQABAAAA1gAAACgBAwABAAAAAgAAADEBAgAcAAAA3gAAADIBAgAU
AAAA+gAAABMCAwABAAAAAQAAAGmHBAABAAAAEAEAADgCAAAIAAgACABOb2tpYQDAxi0AECcAAMDG
LQAQJwAAQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzADIwMTI6MTI6MDEgMjA6MTk6MTIAAAAS
AJ2CBQABAAAA7gEAAACQBwAEAAAAMDIyMAOQAgAUAAAA9gEAAASQAgAUAAAACgIAAAGRBwAEAAAA
AQIDAAKSBQABAAAAHgIAAAiSAwABAAAABAAAAAmSAwABAAAAGQAAAAqSBQABAAAAJgIAAACgBwAE
AAAAMDEwMAGgAwABAAAAAQAAAAKgBAABAAAAzgMAAAOgBAABAAAAEgUAAAGkAwABAAAAAAAAAAKk
AwABAAAAAAAAAAOkAwABAAAAAAAAAASkBQABAAAALgIAAAakAwABAAAAAAAAAAAAAAAgAAAACgAA
ADIwMTA6MTA6MDggMjA6MTM6MTkAMjAxMDoxMDowOCAyMDoxMzoxOQBAAQAAZAAAADEAAAAKAAAA
ZAAAAGQAAAAAAAYAAwEDAAEAAAAGAAAAGgEFAAEAAACGAgAAGwEFAAEAAACOAgAAKAEDAAEAAAAC
AAAAAQIEAAEAAACWAgAAAgIEAAEAAAB8FAAAAAAAAEgAAAABAAAASAAAAAEAAAD/2P/tAAxBZG9i
ZV9DTQAB/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEM
DAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQR
DAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAoAB4AwEiAAIR
AQMRAf/dAAQACP/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAA
AAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIj
JBVSwWIzNHKC0UMHJZJTHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU
5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITES
BEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi
etc...
Comme si je reçevais le code de mon fichier au lieu du mail à proprement parler.

Revoilà mon code à ce stade :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
<?
var_dump($_FILES['piece_jointe']);
 
if ($_FILES["piece_jointe"]["name"] != null) { 
 
// Récupération des information du formulaire
 
$to = monadressemail@domaine.com
$name = $_POST['name'];
$from = $_POST['from'];
$tel = $_POST['tel'];
$object = $_POST['object'];
$contenu = $_POST['contenu'];
 
 
			$fileatt = $_FILES['piece_jointe']['tmp_name'];
			$fileatt_type = $_FILES['piece_jointe']['type'];
			$fileatt_name = $_FILES['piece_jointe']['name'];
 
			if (is_uploaded_file($fileatt)) {
				// Read the file to be attached
				$file = fopen($fileatt,'rb');
				$data = fread($file,filesize($fileatt));
				fclose($file);
 
				// Generate a boundary string
				$semi_rand = md5(time());
				$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
 
				// Add the headers for a file attachment
				$headers .= "\nMIME-Version: 1.0\n" .
						"Content-Type: multipart/mixed;\n" .
						" boundary=\"{$mime_boundary}\"";
 
				// Add a multipart boundary above the plain message
				$msg = "--{$mime_boundary}\n" .
					"Content-Type: text/html; charset=\"iso-8859-1\"\n" .
					"Content-Transfer-Encoding: 7bit\n\n" .
					$contenu . "\n\n";
 
				// Base64 encode the file data
				$data = chunk_split(base64_encode($data));
 
				// Add file attachment to the message
				$msg .= "--{$mime_boundary}\n" .
					"Content-Type: {$fileatt_type};\n" .
					" name=\"{$fileatt_name}\"\n" .
					"Content-Disposition: inline;\n" .
					" filename=\"{$fileatt_name}\"\n" .
					"Content-Transfer-Encoding: base64\n\n" .
					$data . "\n\n" .
					"--{$mime_boundary}--\n";
 
				$messageEnvoye = mail($to,$object,$msg,$headers);
 
 
		} else {
	echo "trop gros";			// Fichier trop gros => gerer erreur
			}
}
et mon formulaire situé sur la même page est :
Code :
1
2
3
4
5
6
7
8
9
10
 
<form id='soumission' method="post" enctype="multipart/form-data" action="<?php echo( $_SERVER['REQUEST_URI'] ); ?>">  
<label for="name">Votre nom</label><input type="text" name="name" id="name" size="25" value="<?php echo( $name ); ?>" />
<label for="from">Votre adresse mail</label><input type="text" name="from" id="from" size="25" value="<?php echo( $from ); ?>" />
<label for="tel">Votre téléphone</label><input type="text" name="tel" id="tel" size="25" value="<?php echo( $tel ); ?>" />
<label for="object">Objet</label><input type="text" name="object" id="object" size="25" value="<?php echo( $object ); ?>" />
<label for="contenu">Message</label><textarea name="contenu" id="contenu" rows="10" cols="70"><?php echo( $contenu ); ?></textarea>
<label for="piece_jointe">Piece jointe</label><input type="hidden" name="MAX_FILE_SIZE" value="2000000" /><input type="file" name="piece_jointe" id="piece_jointe" />
<input type="reset" name="reset" value="Effacer" /><input type="submit" name="send" value="Envoyer" />
</form>
Une idée ?
ThufirHawat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 13h21   #5
ThufirHawat
Invité de passage
 
Inscription : mars 2004
Messages : 23
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 23
Points : 3
Points : 3
Par défaut suite et fin

Bonjour,

N'ayant pas mis tous mes oeufs dans le même panier, j'ai également posté sur un autre forum où j'ai reçu la réponse salvatrice. J'ajoute donc la correction ici si ça peut servir à quelqu'un.

Dans mon code il fallait remplacer
Code :
1
2
3
$headers .= "\nMIME-Version: 1.0\n" .
"Content-Type: multipart/mixed;\n" .
" boundary=\"{$mime_boundary}\"";
par
Code :
1
2
$headers = 'MIME-Version: 1.0'."\n"; 
$headers .= 'Content-Type: multipart/mixed; boundary="'.$mime_boundary.'"';
Avec quelques modifications supplémentaires pour la mise en forme, le contrôle des erreurs et l'affichage de toutes les données dans le mail, mais au moins cela fonctionne.

Merci à sabotage pour son aiguillage et merci à c00lman sur l'autre forum.
ThufirHawat est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h47.


 
 
 
 
Partenaires

Hébergement Web