Formulaire mail + fichier en pièce jointe

Fermé
frugi Messages postés 53 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 26 janvier 2016 - 19 oct. 2012 à 17:17
frugi Messages postés 53 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 26 janvier 2016 - 20 oct. 2012 à 17:34
Bonjour,

J'aimerais concevoir un formulaire basique (nom, prénom, adresse, téléphone etc) qui permettrait aussi d'envoyer un fichier.
Le tout s'envoyant sur mon adresse e-mail, avec si possible le fichier en pièce jointe.

Alors les formulaires sans fichier je sais faire.
Mais du coup là ça se corse.
J'ai passé la journée à faire des recherches, à essayer pas mal de choses, mais rien ne fonctionne correctement T_T
Je sais qu'il faut d'abord que le fichier se retrouve sur le serveur, dans le "répertoire de base".
Mon site se trouve sous OVH et tout mon problème est de savoir se situe ce fichu "répertoire de base", ou où je dois le mettre s'il je dois le créer...


En utilisant ce générateur: https://www.unesourisetmoi.info/formulairepro/page6.php
J'ai obtenu ce code ci:

<?php

// On vérifie si la fonction ini_set() a été désactivée...
$desactive = ini_get('disable_functions');
if (preg_match("/ini_set/i", "$desactive") == 0) {
// Si elle n'est pas désactivée, on définit ini_set de manière à n'afficher que les erreurs...
ini_set("error_reporting" , "E_ALL & ~E_NOTICE");
}

// Vérifier que le formulaire a été envoyé...
if (isset($_POST['envoi'])) {



// Définir l'indicateur d'erreur sur zéro...
$flag_erreur = 0;

//On commence une session pour enregistrer les variables du formulaire...

session_start();



// Nbre de zones de sélection de fichiers -1 car on commence le tableau à zéro...
	$nbre_zones_fichiers = 1 - 1;

	// Répertoire de téléchargement du fichier...
	$repertoire = "/www/fichiers/upload";

	// Taille maximale autorisée en octets...
	$taille_max_fichier = 1024000;

	// Extensions de fichiers autorisées...
	$extensions_autorisees = array("gif","jpg","jpeg","","","","pdf","");

// Définir l\'icone apparaissant en cas d\'erreur...


// Définir sur 0 pour afficher un petit x de couleur rouge.
// Définir sur 1 pour afficher l\'image d\'une croix rouge telle que celle utilisée dans l\'assistant
// Si vous utilisez l\'option 1, l\'image de la croix rouge \'icone.gif\' doit se trouver dans le répertoire \'images\',
// ce dernier devant se trouver au même niveau que votre formulaire...
$flag_icone = 0;

// On vérifie si $flag_icone est défini sur 0 ou 1...
if ($flag_icone == 0) {
$icone = "<b><font size=\"3\" face=\"Arial, Verdana, Helvetica, sans-serif\" color=\"#CC0000\">x</font></b>";
} else {
$icone = "<img src=\"images/icone.gif\"";
}


//Validation PHP des éléments du formulaire...

//Envoi avec fichier...

	if (($_FILES['fichier']['name']['0'] !="") && is_array($_FILES)) {

		

if (!is_dir($repertoire)) {
		$erreur_fichier[0] = "Le répertoire de téléchargement spécifié n'existe pas!";
		$flag_erreur = 1;
		} else {

			// Vérifier si le répertoire a les droits en écriture...
			if (!is_writeable($repertoire)) {
			$erreur_fichier[0] = "Le répertoire spécifié n'a pas les droits d'accès en écriture.";
			$flag_erreur = 1;
			} else {
		
				// On boucle x nbre de fois, sauf si aucun fichier n'a été sélectionné...
				for ($u = 0; $u <= $nbre_zones_fichiers, $_FILES['fichier']['name'][$u] != ""; $u++) {
		
					// Vérifier les éventuelles erreurs de téléchargement du fichier...
					if ($_FILES['fichier']['error'][$u] != 0) {
			
			
						switch ($_FILES['fichier']['error'][$u]) {
   						//case UPLOAD_ERR_OK:
						case 0;
       					break;
   						//case UPLOAD_ERR_INI_SIZE:
						case 1;
       					$erreur_fichier[$u] = "Le fichier téléchargé dépasse la taille maximale autorisée par le serveur.";
						$flag_erreur = 1;
       					break;
   						//case UPLOAD_ERR_FORM_SIZE:
						case 2;
      					$erreur_fichier[$u] = "Le fichier téléchargé dépasse la taille maximale autorisée par le formulaire.";
						$flag_erreur = 1;
						break;
   						//case UPLOAD_ERR_PARTIAL:
						case 3;
      	 				$erreur_fichier[$u] = "Le fichier n'a été téléchargé que partiellement.";
						$flag_erreur = 1;
       					break;
   						//case UPLOAD_ERR_NO_FILE:
						case 4;
      					$erreur_fichier[$u] = "Aucun fichier n'a été téléchargé.";
						$flag_erreur = 1;
       					break;
   						// case UPLOAD_ERR_NO_TMP_DIR:
						case 6:
       					$erreur_fichier[$u] = "Répertoire temporaire manquant.";
						$flag_erreur = 1;
       					break;
  						// case UPLOAD_ERR_CANT_WRITE:
						case 7:
       					$erreur_fichier[$u] = "Echec d'écriture du fichier";
						$flag_erreur = 1;
      					break;
   						default:
    	   				$erreur_fichier[$u] = "Erreur de fichier inconnue";
						$flag_erreur = 1;
						} // fin du switch
			
					} else {
			
			
            		// On vérifie si la taille du fichier ne dépasse pas le maximum autorisé
            		if ($_FILES['fichier']['size'][$u] > $taille_max_fichier) {
            		$erreur_fichier[$u] = "Le fichier téléchargé dépasse la taille maximum autorisée.";
					$flag_erreur = 1;
            		} else {

                	// On met le nom du fichier en minuscules...
                	$nom_fichier = strToLower($_FILES['fichier']['name'][$u]);

            		// On recherche la position du point dans le nom de fichier...
					$dernPos = strRChr($nom_fichier, ".");

            		// On extrait l'extension du fichier...
            		$extension = strToLower(subStr($dernPos, 1));

            		// Si l'extension n'existe pas ou qu'elle ne fait pas partie des extensions autorisées...
            		if (($dernPos == "") OR (in_array($extension, $extensions_autorisees) == false)) {
            		$erreur_fichier[$u] = "L'extension de fichier spécifiée n'est pas autorisée.";
					$flag_erreur = 1;
            		} else {

                   	//On extrait seulement le nom du fichier sans l'extension, $dernPos donnant l'extension avec le point.
                   	$posExtension = strpos($nom_fichier, $dernPos);
                   	$nom_sans_extension = substr($nom_fichier,0,$posExtension);
                   
                   	// On ajoute au nom du fichier un numéro unique puis l'extension du fichier...
                   	$nom_unique[$u] = $nom_sans_extension. "_ID_" . uniqid(rand()).$dernPos;
				
					} // Fin du else
	
                  } // Fin du else 
				  
              }	// Fin du else
			
						
            } // Fin de la boucle for... ()
			
		// On boucle une seconde fois, et on ne copie les fichiers que si aucun d'eux n'a retourné d'erreurs...
		$u = 0;
		while ((($u<= $nbre_zones_fichiers) && ($_FILES['fichier']['name'][$u] != "") && ($flag_erreur !=1))) {
						
				// On déplace le fichier téléchargé du répertoire temporaire sur le répertoire spécifié
                if (!move_uploaded_file($_FILES['fichier']['tmp_name'][$u], $repertoire."/".$nom_unique[$u])) {
                $erreur_move_uploaded[$u] = "Impossible de déplacer le fichier dans le répertoire de destination...";
				$flag_erreur = 1;
                } // Fin du if
		$u++;		
		} // Fin de la boucle while

		
		}	// Fin du else
		
	}	// Fin du else
	
} // Fin du if (($_FILES['fichier']['name']['0'] !="") && is_array($_FILES)) {

// N'envoyer le formulaire que s'il n'y a pas d'erreurs...
if ($flag_erreur == 0) {					

// Addresse de réception du formulaire
$email_dest = "XXX@YYY.fr";
$sujet = "Sujet du mail";

if (($_FILES['fichier']['name']['0'] !="") && is_array($_FILES)) {


	// En-têtes spécifiques de l'e-mail AVEC pièce jointe:
	// Génération d'une chaîne de délimitation
	$semi_rand = md5(time());
	$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
							
	$entetes ="MIME-Version: 1.0 \n";
	$entetes .="From: XXX<XXX@YYY.fr>\n";
	$entetes .="Content-Type: multipart/mixed;\n";
	$entetes .=" boundary=\"{$mime_boundary}\"";
							
	$partie_entete = "Message au format MIME.\n\n" .
	"--{$mime_boundary}\n" .
	"Content-Type: text/html; charset=\"iso-8859-1\"\n" .
	"Content-Transfer-Encoding: 7bit\n\n" .
	"<html>\n<head>\n<meta http-equiv=Content-Type content=text/html; charset=iso-8859-1>\n</head>\n<body bgcolor=#FFFFFF>\n";
	} else { // En-têtes de l'e-mail sans envoi de fichier...
	$entetes ="MIME-Version: 1.0 \n";
	$entetes .="From: XXX<XXX@YYY.fr>\n";
	$entetes .="Return-Path: XXX<XXX@YYY.fr>\n";
	$entetes .="Reply-To: XXX<XXX@YYY.fr>\n";
	$entetes .="Content-Type: text/html; charset=iso-8859-1 \n";
	
	$partie_entete = "<html>
<head>
<title>Formulaire</title>
<meta http-equiv=Content-Type content=text/html; charset=iso-8859-1>
</head>
<body bgcolor=#FFFFFF>\n";

	} // fin du else...



//Partie HTML de l'e-mail...


// Enfin, on indique le nom et l'emplacement de la pièce jointe sur le serveur.
if (($_FILES['fichier']['name']['0'] !="") && is_array($_FILES)) {

// On boucle x nbre de fois, sauf si aucun fichier n'a été sélectionné...
									for ($u = 0; $u <= $nbre_zones_fichiers, $_FILES['fichier']['name'][$u] != ""; $u++) {
									$a = $u + 1;
									$partie_fichier .= "<font face=\"Verdana\" size=\"2\" color=\"#003366\">Pièce jointe $a : " . $nom_unique[$u] . "</font><br>";
									} // Fin de la boucle for...
									
									$partie_fichier .= "<font face=\"Verdana\" size=\"2\" color=\"#003366\">Pièces jointes conservées dans le répertoire : /www/fichiers/upload</font><br>";
								} // Fin du if...
						$fin = "</body></html>\n\n";

// Si envoi de fichier...
if (($_FILES['fichier']['name']['0'] !="") && is_array($_FILES)) {

		
					// Construction de la pièce jointe...
                    for ($u = 0; $u <= $nbre_zones_fichiers, $_FILES['fichier']['name'][$u] != ""; $u++) {

                    $type = $_FILES['fichier']['type'][$u];
					
					// Lecture du fichier ('rb' = lecture en binaire)
					$fichier = fopen($repertoire . "/" . $nom_unique[$u],'rb');
					$donnees = fread($fichier,filesize($repertoire . "/" . $nom_unique[$u]));
					fclose($fichier);
							
					// Encodage Base64 des données
					$donnees = chunk_split(base64_encode($donnees));
							
					// Partie piece jointe de l'e-mail
					$piece_jointe .= "--{$mime_boundary}\n" .
              		"Content-Type: {$type};\n" .
              		" name=\"{$nom_unique[$u]}\"\n" .
              		"Content-Disposition: attachment;\n" .
              		" filename=\"{$nom_unique[$u]}\"\n" .
              		"Content-Transfer-Encoding: base64\n\n" .
              		$donnees . "\n\n";

                    } // Fin de la boucle for...

					// Fin de la pièce jointe...
                    $piece_jointe .= "--{$mime_boundary}--\n";
					
					$sortie = $partie_entete . $partie_champs_texte . $partie_zone_email . $partie_listes . $partie_boutons . $partie_cases . $partie_zone_texte . $partie_fichier . $fin . $piece_jointe;
					
					} else {
					$sortie = $partie_entete . $partie_champs_texte . $partie_zone_email . $partie_listes . $partie_boutons . $partie_cases . $partie_zone_texte . $fin;

					}

					// Send the e-mail
					if (@!mail($email_dest,$sujet,$sortie,$entetes)) {
					echo("Envoi du formulaire impossible");
					exit();
					} else {

                    // Rediriger vers la page de remerciement
                    header("Location:fin.html");
                    exit();
                  } // Fin else
			    } // Fin du if ($flag_erreur == 0) {
			} // Fin de if POST
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>

<body>
<form name="mail_form" method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>" enctype="multipart/form-data">
  <div align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif, Tahoma"><strong>Formulaire
    de contact</strong></font></div><br></br><table align="center" width="566" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td height="16"><div align="center">
  <font color="#CC0000" size="2" face="Verdana, Arial, Helvetica, sans-serif, Tahoma"><strong><?php
if ($erreur_fichier[0]) {
	  echo(stripslashes($erreur_fichier[0]));
	  } else {
} // Fin du else...
?>
    </strong></font>
    </div></td>
      </tr>
    </table>
<p align="center"></p><table width="566" border="0" align="center"><tr>
      <td width="140" align="right"><font face="Verdana" size="2">Fichier<input name="MAX_FILE_SIZE" type="hidden" value="1024000"></input></font></td>
	  <td width="30" align="center" valign="middle">
	  <?php
	  if ($erreur_fichier[0]) {
	  echo($icone);
	  }
	  ?>
	  </td>
	  
      <td><input type="file" name="fichier[]" id="fichier1"></input>
        <font face="Verdana" size="2">(1 Mo maximum)</font></td>
    </tr></table><table width="566" border="0" align="center"><tr>
<td valign="top"><div align="center"> 
          <input type="reset" name="Reset" value=" Effacer "></input>
            
          <input type="submit" name="envoi" value="Envoyer"></input>
        </div></td></tr></table><div align="center"><input name="nbre_fichiers" type="hidden" id="nbre_fichiers" value="1"></input></div></form>
</body>
</html>


C'est uniquement le code pour l'envoi du fichier que j'essaie de tester pour le moment, le reste étant déjà fait.

Bref, avec ce code, je peux utiliser n'importe quel répertoire, le mettre où je veux (dans le répertoire "www", au-dessus, dans un sous-dossier de "www", ...), le formulaire m'indiquera toujours "Le répertoire de téléchargement spécifié n'existe pas! " si j'essaie d'uploader un fichier.
J'ai bien défini les répertoires sur chmod 777, mais rien à faire.

Donc ma question est simple? Est-ce que le code est faux où est-ce que je dois créer ces répertoires autre part? Et si oui, où?

Un rapport avec la basedir et/ou le phpinfo?

Je suis larguée ><


Bon aprem =)

A voir également:

5 réponses

Fallentree Messages postés 2309 Date d'inscription mercredi 25 février 2009 Statut Membre Dernière intervention 22 juillet 2019 208
19 oct. 2012 à 17:38
"J'aimerais concevoir un formulaire basique (nom, prénom, adresse, téléphone etc) qui permettrait aussi d'envoyer un fichier.
Le tout s'envoyant sur mon adresse e-mail, avec si possible le fichier en pièce jointe. "
cette partie gere les pieces jointes
if (($_FILES['fichier']['name']['0'] !="") && is_array($_FILES)) {
$nom_fichier = strToLower($_FILES['fichier']['name'][$u]);
le plus simple est de deplacer le fichier vers un repertoire connu ...
 }
0
Fallentree Messages postés 2309 Date d'inscription mercredi 25 février 2009 Statut Membre Dernière intervention 22 juillet 2019 208
20 oct. 2012 à 11:48
// print_r ($_POST);   echo "<hr>";   print_r ($_FILES);   echo "<hr>";
if (($_FILES['fichier']['name']['tmp_name'] !="") && is_array($_FILES)) {
$value="Format_a_voir";
 if (move_uploaded_file($_FILES['fichier']['tmp_name'], $value)){
      echo "upload du fichier : ";
      }}


Y a pas de move_uploaded dans to code...
ou encore

<?php
$uploads_dir = '/uploads';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
    }
}
?> 
0
Fallentree Messages postés 2309 Date d'inscription mercredi 25 février 2009 Statut Membre Dernière intervention 22 juillet 2019 208
20 oct. 2012 à 11:48
http://fr2.php.net/manual/fr/function.move-uploaded-file.php
0
Fallentree Messages postés 2309 Date d'inscription mercredi 25 février 2009 Statut Membre Dernière intervention 22 juillet 2019 208
20 oct. 2012 à 11:49
houps^pardon !!
ctrl+F
0
frugi Messages postés 53 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 26 janvier 2016
19 oct. 2012 à 18:09
Mais justement, que je spécifie un répertoire déjà créé et qui est valide puisque j'utilise son contenu, ou que je crée un nouveau répertoire (n'importe où), ça m'affiche toujours que le répertoire n'existe pas...
0
Fallentree Messages postés 2309 Date d'inscription mercredi 25 février 2009 Statut Membre Dernière intervention 22 juillet 2019 208
20 oct. 2012 à 11:53
Il doit s agir du repertoire du Upload ...
Il me semble que tu dois le céeer
je crois qu il se situe a la racine sous le nom "tmp" avec les droits 700.
Je vais verifier.
0
Fallentree Messages postés 2309 Date d'inscription mercredi 25 février 2009 Statut Membre Dernière intervention 22 juillet 2019 208
20 oct. 2012 à 12:25
dans Php.ini
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;

; Whether to allow HTTP file uploads.
file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
upload_tmp_dir = "c:/wamp/tmp"

; Maximum allowed size for uploaded files.
upload_max_filesize = 2M

0
frugi Messages postés 53 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 26 janvier 2016
20 oct. 2012 à 15:53
Merci pour tes réponses =)

Donc je rajoute ça à mon php.ini et je crée le dossier "tmp" à la racine (donc au-dessus de "www") sur chmod 700?

Je laisse le "open_basedir = XXX"? Et si oui je met "tmp" à la place des XXX?
0
frugi Messages postés 53 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 26 janvier 2016
20 oct. 2012 à 15:57
Et je met "tmp" comme répertoire ici:

$partie_fichier .= "<font face=\"Verdana\" size=\"2\" color=\"#003366\">Pièces jointes conservées dans le répertoire : /tmp</font><br>";

et là:

// Répertoire de téléchargement du fichier...
$repertoire = "/tmp";

?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
frugi Messages postés 53 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 26 janvier 2016
20 oct. 2012 à 17:34
C'est bon, j'ai trouvé, j'ai donc mis:

;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;

; Whether to allow HTTP file uploads.
file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
upload_tmp_dir = "XXX"

; Maximum allowed size for uploaded files.
upload_max_filesize = 2M


Où XXX est le répertoire (autre que tmp) où je veux stocker les fichiers qu'on m'envoie.
Et j'ai mis le même répertoire dans le php du formulaire.
Du coup c'est nickel, je reçois à la fois le fichier par mail en pièce jointe, et dans ce répertoire.

Merci pour ton aide @Fallentree !

En espérant que ça puisse en aider d'autres =)

Bonne journée
0