Bonjour,

Est ce qu'il y aurait une âme charitable ?
Je souhaiterai réaliser un formulaire qui permet de charger des fichiers (jpg, pdf, etc).
JE N'Y ARRIVE PAS...
Serait il possible de me montrer les codes ? avec explication en php pure...
au secours...

10 réponses


Nicolas Caux
Auteur
Réponse acceptée

Bonjour à tous,
Merci à Lartak et TheTakylo de vous être penchés sur mon problème.
Je n 'ai pas réusssi hier a m'envoyer de pièce jointes, j'ai donc tout repris à zéro (recherche, forum, mail etc...)
J'ai eu une réponse par mail qui m'expliquait exactement comment faire grâce notamment à l'aide un developpeur ( https://lesdocs.fr/php-mysql/ ) qui m'a dirigé vers ce site web ( http://www.marinelemetayer.fr/php-envoi-dun-mail-piece-jointe/ ).
Tout est expliqué en détail avec des commentaires.
J'ai testé et il a fallu corrigé 2 choses (solution trouvée par Frederic Leclerq formateur chez WebForce3)

Depuis ca marche très bien !

J'envoie donc le code qui fonctionne pour ceux qui ont souffert comme moi et qui cherche la solution déséspéremment...

// fichier html
<form action="mail.php" method="post" enctype="multipart/form-data">
<label for="nom">Votre nom</label>
<input type="text" name="nom" required/>
<label for="email">Votre E-mail</label>
<input type="email" name="email" required/>
<label for="message">Votre demande</label>
<textarea name="message" rows="2" cols="50" required></textarea>
<label for='fichier'>Ajouter une pièce jointe <span>(jpeg ou pdf, max 2Mo)</span></label>
<input type="file" name="fichier" id="fichier">
<input type="submit" value="Envoyer">
</form>

// fichier php
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1); //Affichage des erreurs

//Eviter les insertions de scripts dans le cas d'un e-mail HTML
$nom = htmlentities($_POST['nom']);
$email_from = htmlentities($_POST['email']);
$message = htmlentities($_POST['message']);

//Verifie si le fournisseur prend en charge les r
if(preg_match("#@(hotmail|live|msn).[a-z]{2,4}$#", $email_from)){
$passage_ligne = "\n";
}else{
$passage_ligne = "\r\n";
}

$email_to = "votre email a mettre ici"; //Destinataire
$email_subject = "Contact pour ..."; //Sujet du mail
$boundary = md5(rand()); // clé aléatoire de limite

function clean_string($string) {
$bad = array("content-type","bcc:","to:","cc:","href");
return str_replace($bad,"",$string);
}

$headers = "From: \"".$nom."\"<".$email_from.">" . $passage_ligne; //Emetteur
$headers.= "Reply-to: \"".$nom."\" <".$email_from.">" . $passage_ligne; //Emetteur
$headers.= "MIME-Version: 1.0" . $passage_ligne; //Version de MIME
$headers.= 'Content-Type: multipart/mixed; boundary='.$boundary .' '. $passage_ligne; //Contenu du message (alternative pour deux versions ex:text/plain et text/html

$email_message = '--' . $boundary . $passage_ligne; //Séparateur d'ouverture
$email_message .= "Content-Type: text/plain; charset='utf-8'" . $passage_ligne; //Type du contenu
$email_message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; //Encodage
$email_message .= $passage_ligne .clean_string($message). $passage_ligne; //Contenu du message

//Pièce jointe
if(isset($_FILES["fichier"]) && $_FILES['fichier']['name'] != ""){ //Vérifie sur formulaire envoyé et que le fichier existe
$nom_fichier = $_FILES['fichier']['name'];
$source = $_FILES['fichier']['tmp_name'];
$type_fichier = $_FILES['fichier']['type'];
$taille_fichier = $_FILES['fichier']['size'];

if($nom_fichier != ".htaccess"){ //Vérifie que ce n'est pas un .htaccess
     if($type_fichier == "image/jpeg" 
        || $type_fichier == "image/pjpeg" 
        || $type_fichier == "application/pdf"){ //Soit un jpeg soit un pdf

        if ($taille_fichier <= 2097152) { //Taille supérieure à Mo (en octets)
            $tabRemplacement = array("é"=>"e", "è"=>"e", "à"=>"a"); //Remplacement des caractères spéciaux

            $handle = fopen($source, 'r'); //Ouverture du fichier
            $content = fread($handle, $taille_fichier); //Lecture du fichier
            $encoded_content = chunk_split(base64_encode($content)); //Encodage
            $f = fclose($handle); //Fermeture du fichier

            $email_message .= $passage_ligne . "--" . $boundary . $passage_ligne; //Deuxième séparateur d'ouverture
            $email_message .= 'Content-type:'.$type_fichier.';name="'.$nom_fichier.'"'."\n"; //Type de contenu (application/pdf ou image/jpeg)
            $email_message .='Content-Disposition: attachment; filename="'.$nom_fichier.'"'."\n"; //Précision de pièce jointe
            $email_message .= 'Content-transfer-encoding:base64'."\n"; //Encodage
            $email_message .= "\n"; //Ligne blanche. IMPORTANT !
            $email_message .= $encoded_content."\n"; //Pièce jointe

        }else{
            //Message d'erreur
            $email_message .= $passage_ligne ."L'utilisateur a tenté de vous envoyer une pièce jointe mais celle ci était superieure à 2Mo.". $passage_ligne;
        }
    }else{
        //Message d'erreur
        $email_message .= $passage_ligne ."L'utilisateur a tenté de vous envoyer une pièce jointe mais elle n'était pas au bon format.". $passage_ligne;
    }
}else{
    //Message d'erreur
    $email_message .= $passage_ligne ."L'utilisateur a tenté de vous envoyer une pièce jointe .htaccess.". $passage_ligne;
}

}
$email_message .= $passage_ligne . "--" . $boundary . "--" . $passage_ligne; //Séparateur de fermeture

if(mail($email_to,$email_subject, $email_message, $headers)==true){ //Envoi du mail
header('Location: form.html'); //Redirection
}
?>

Bonjour.
Ta demande est totalement inexplicable étant donné qu'en titre de ton sujet tu parles de réception par mail, d'upload de fichier et de formulaire, alors que les trois sont incompatible, tout du moins ensembles.
Tu peux très bien faire :

  • un formulaire qui permettra par la suite d'envoyer un email
  • un formulaire qui permet d'uploader fichier
  • un mail qui aura en pièce jointe un fichier
  • un mail qui contiendra un lien pour télécharger un fichier
  • un mail qui contiendra un lien vers un formulaire qui permet d'upload un fichier

Mais tu ne peux pas faire un mail qui contiendrait un formulaire pour upload un fichier.
Sans oublier qu'il est fortement non recommandé de joindre des fichiers un peu trop volumineux par mail, tel que des fichiers audio, vidéo et archives par exemple.
Autre chose aussi, tu nous demandes de te montrer un code complet d'upload de fichier avec formulaire, mais les demandes d'aides concernant du code sur le forum, n'est pas prévu pour que des utilisateurs fournissent du code à un utilisateur qui le demande, mais pour aider un utilisateur quand il a un problème avec son code (qu'il a donc déja commencé à coder), ou pour lui donner des pistes.
Sauf que toi tu voudrais que nous te donnions un code tout fait avec des explications pour chaque étape, ce qui ne peut nous faire déduire que tu n'as aucune connaissance dans ce que tu demandes

Pardon "Mon Seigneur Lartak" !
Ai je peut etre mal formulé ma demande.
Effectivement j'ai besoin d'aide, j'ai passé plus d'une journée a essayer de comprendre et de réaliser un formulaire qui permet d'envoyer un fichier afin de le recevoir sur sa boite mail. J'ai beau regarder les vidéos et refaire le tutoriel de Grafikart et d'autres sites,
https://www.grafikart.fr/tutoriels/formulaire-php-21
Helas ca ne réponds pas à ce que je souhaiterai d'où ma demande d'aide.
Merci de m'avoir répondu

réaliser un formulaire qui permet d'envoyer un fichier afin de le recevoir sur sa boite mail

Je ne comprends pas du tout l'intérêt de créer un formulaire afin que l'utilisateur upload un fichier sur le serveur pour que par la suite il le reçoive dans sa boîte mail.
Ce serait à la rigueur plus logique qu'il puisse upload un fichier sur le serveur et lui envoyer un mail avec un lien qui lui permette de télécharger le fichier.
Bien qu'avec tous les hébergeurs de fichiers gratuits sur le web, il lui serait plus simple de passer par eux.

Et bien pour essayer d'etre plus explicite...
je réalise un formulaire dans lequel un internaute depose un fichier pdf (comme un cv).
et je souhaiterai que la destination soit une adresse mail.
J'arrive a recevoir les mails mais pas la piece jointe...
Je ne sais pas si j'ai été claire

je réalise un formulaire dans lequel un internaute depose un fichier pdf (comme un cv)

Est-ce qu'au moins le fichier est bien sauvegardé sur le serveur lors de la soumission et le traitement du formulaire ?

J'arrive a recevoir les mails mais pas la piece jointe...

Dans ce cas là, montres nous le code que tu as fait pour envoyer le mail, de cette manière nous pourrons mieux t'aider et peut être même directement te dire où tu as pu faire une erreur pour la pièce jointe de ton mail.

Comment procède-tu, ce serait plus simple si on pouvais voir le code qui gère ton formulaire.
Tu devrais uploader le fichier sur ton serveur et ensuite le joindre dans le mail. Tu peux utiliser une librairie comme swiftmailer, ou bien sans librairie: example sur stackoverflow

Bonjour à tous,
Avant de commencer... merci !
Merci à tous de m'avoir répondu aussi rapidemment.
Pour info, j'ai testé tellement de fichiers (sans vraiment les comprendre) que je preferais ne rien envoyer vendredi.
HIer j'ai passé la journée a recommencer, visionner des tutos... rien n'y fait.

Ce que je souhaiterai

  • Remplir un formulaire en incluant un fichier ( jpg, pdf ou autre... )
  • Sa destination : une boite mail ( hotmail, gmail ou autre... )

Ce que j'ai compris

  • 1 page html ou php ( qui contient le formulaire )
  • 1 page php qui va recevoir les données, les verifier et les envoyer au mail indiqué.

Ce que j'ai bidouillé

J'ai trouvé sur le web quelqu'un qui commente son code.
J'y ai inclus bootstrap, lorsque j'ai tenté de mettre un <input type="file"> rien ne marche (pas d'envoie de mail), car il faut l'inclure dans la page php et je ne sais pas comment m'y prendre.
Je l'ai donc retiré.
Voici les deux fichiers :

// index.html

<!DOCTYPE html>
<html lang="fr">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<title>Formulaire</title>
</head>

<body>
<div class="container">

    <form method="post" action="envoi.php">
        <div class="col-lg-6 form-group">
            <label for="nom">Votre nom</label>
            <input type="text" id="nom" name="nom" class="form-control" size="30">
        </div>
        <div class="col-lg-6 form-group">
            <label for="prenom">Votre prénom</label>
            <input type="text" id="prenom" name="prenom" class="form-control" size="30">
        </div>
        <div class="col-lg-12 form-group">
            <label for="email">Votre Email</label>
            <input type="text" name="email" id="email" class="form-control" size="30">
        </div>
        <div class="col-lg-12 form-group">
            <label for="message">Écrivez votre message</label>
            <textarea name="message" id="message" class="form-control" rows="10"></textarea>
        </div>
        <div class="col-lg-12 form-group">
            <p>Combien font 1+3: <span style="color:#ff0000;">*</span>: <input type="text" name="captcha" size="2" /></p>
        </div>
        <div class="form-group">
            <button type="submit" class="btn btn-primary">Envoyer</button>
        </div>
    </form>

</div>

</body>

</html>

// envoi.php

<?php
// S'il y des données de postées
if ($_SERVER['REQUEST_METHOD']=='POST') {
// Code PHP pour traiter l'envoi de l'email

$nombreErreur = 0; // Variable qui compte le nombre d'erreur

// Définit toutes les erreurs possibles
if (!isset($_POST['email'])) { // Si la variable "email" du formulaire n'existe pas (il y a un problème)
$nombreErreur++; // On incrémente la variable qui compte les erreurs
$erreur1 = '<p>Il y a un problème avec la variable "email".</p>';
} else { // Sinon, cela signifie que la variable existe (c'est normal)
if (empty($_POST['email'])) { // Si la variable est vide
$nombreErreur++; // On incrémente la variable qui compte les erreurs
$erreur2 = '<p>Vous avez oublié de donner votre email.</p>';
} else {
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$nombreErreur++; // On incrémente la variable qui compte les erreurs
$erreur3 = '<p>Cet email ne ressemble pas un email.</p>';
}
}
}

if (!isset($_POST['message'])) {
$nombreErreur++;
$erreur4 = '<p>Il y a un problème avec la variable "message".</p>';
} else {
if (empty($_POST['message'])) {
$nombreErreur++;
$erreur5 = '<p>Vous avez oublié de donner un message.</p>';
}
}

if (!isset($_POST['captcha'])) {
$nombreErreur++;
$erreur6 = '<p>Il y a un problème avec la variable "captcha".</p>';
} else {
if ($_POST['captcha']!=4) {
$nombreErreur++;
$erreur7 = '<p>Désolé, le captcha anti-spam est erroné.</p>';
}
}

if ($nombreErreur==0) { // S'il n'y a pas d'erreur
// Récupération des variables et sécurisation des données
$nom = htmlentities($_POST['nom']); // htmlentities() convertit des caractères "spéciaux" en équivalent HTML
$prenom = htmlentities($_POST['prenom']);
$email = htmlentities($_POST['email']);
$message = htmlentities($_POST['message']);

// Variables concernant l'email
$destinataire = 'mail@mail.fr'; // Adresse email du webmaster
$sujet = 'Titre du message'; // Titre de l'email
$contenu = '<html><head><title>Titre du message</title></head><body>';
$contenu .= '<p>Bonjour, vous avez reçu un nouveau message.</p>';
$contenu .= '<p><strong>Nom</strong>: '.$nom.'</p>';
$contenu .= '<p><strong>Prénom</strong>: '.$prenom.'</p>';
$contenu .= '<p><strong>Email</strong>: '.$email.'</p>';
$contenu .= '<p><strong>Message</strong>: '.$message.'</p>';
$contenu .= '</body></html>'; // Contenu du message de l'email

// Pour envoyer un email HTML, l'en-tête Content-type doit être défini
$headers = 'MIME-Version: 1.0'."\r\n";
$headers .= 'Content-type: text/html; charset=UTF-8'."\r\n";

@mail($destinataire, $sujet, $contenu, $headers); // Fonction principale qui envoi l'email

echo    '<div class="alert alert-success" role="alert">
            Merci ! Votre formulaire a bien été déposé
        </div>'; // Afficher un message pour indiquer que le message a été envoyé

} else { // S'il y a un moins une erreur
echo '<div style="border:1px solid #ff0000; padding:5px;">';
echo '<p style="color:#ff0000;">Désolé, il y a eu '.$nombreErreur.' erreur(s). Voici le détail des erreurs:</p>';
if (isset($erreur1)) echo '<p>'.$erreur1.'</p>';
if (isset($erreur2)) echo '<p>'.$erreur2.'</p>';
if (isset($erreur3)) echo '<p>'.$erreur3.'</p>';
if (isset($erreur4)) echo '<p>'.$erreur4.'</p>';
if (isset($erreur5)) echo '<p>'.$erreur5.'</p>';
if (isset($erreur6)) echo '<p>'.$erreur6.'</p>';
if (isset($erreur7)) echo '<p>'.$erreur7.'</p>';
echo '</div>';
}
}
?>

Est ce que quelqu'un peut m'aider ?
merci beaucoup

Bonjour.
Premier problème dans ton formulaire, tu n'y inclues pas d'input de type file afin que l'utilisateur upload un fichier.
Second problème dans le formulaire, il faut que tu ajoutes l'attribut enctype avec la valeur multipart/form-data pour que le formulaire soit capable de transmettre des données de fichiers dans les données transmises dans le formulaire.
Ensuite pour traiter le fichier, il te faut récupérer ses données via la variable $_FILES sans oublier en index le nom de l'input de ton formulaire qui permet d'upload le fichier.
Soit par exemple pour le formulaire :

<form method="post" action="envoi.php" enctype="multipart/form-data">
    <!-- etc ... -->
    <label for="piece-jointe">Fichier à joindre</label>
    <input type="file" name="piece-jointe" id="piece-jointe" />
    <!-- etc ... -->
</form>

Puis côté traitement PHP, soit la page envoi.php dans ton cas :

// Code de vérifications des données postées via le formulaire ...
$file = $_FILES["piece-jointe"];
// Ensuite tu fais tes vérifications concernant le fichier
// Si c'est bon tu sauvegardes le fichier sur le serveur et le code suivant concerne la création et l'envoi du mail
// dans lequel tu joins le fichier de l'utilisateur qui à présent est disponible depuis le serveur.

Ok merci beaucoup Lartak.
J'essaye de suite
Tes explications sont top !