[RESOLU] Envoi des données formulaire web avec fichier

Petit nouveau ! | 5 Messages

17 sept. 2016, 19:36

Bonjour,
j'ai crée un formulaire web en html avec traitement fichier php et les données sont envoyées par email.
J'ai rajouté la possibilité d'envoyer un fichier en plus de toutes les autres données.
Ca fonctionne mais pas tout à fait comme je le voudrais.
Avant que je n'ajoute le traitement du fichier, lorsqu'on cliquait sur "envoyer"/submit, le visiteur était redirigé vers une page de mon site (succes.html). Maintenant, il m'indique seulement "fichier envoyé correctement".
Je voudrais donc renvoyer vers la page comme avant mais je n'y arrive pas.
Deuxième soucis: le fichier est bien uploadé sur mon serveur. Je voudrais aussi:
soit rajouter dans le mail qu'un fichier a été joint et le nom de ce fichier
soit le mettre en attachement au mail (j'imagine que c'est moins secur? ).
Le formatage du nom du fichier ne fonctionne pas non plus.
voici le code du fichier .php:
<?php
$msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis :<br/><br/>";
$msg_ok = "Votre demande a bien été prise en compte.";
$message = $msg_erreur;
define('MAIL_DESTINATAIRE','[email protected]'); // remplacer par email production après config
define('MAIL_SUJET','Recapitulatif de demande (BETA Version V0.1)');
// vérification des champs contact
if (empty($_POST['name']))
$message .= "Votre nom<br/>";
if (empty($_POST['email']))
$message .= "Votre email<br/>";
// si un champ est vide, on affiche le message d'erreur à la page erreur.htm
if (strlen($message) > strlen($msg_erreur)) {
 header('Location: form-error.htm');
 exit();
// sinon c'est ok on envoi le mail
} else {
foreach($_POST as $index => $valeur) {
$$index = stripslashes(trim($valeur));
}
$dossier = 'uploads/';
$fichier = basename($_FILES['fichierlogo']['name']);
$taille_maxi = 1000000;
$taille = filesize($_FILES['fichierlogo']['tmp_name']);
$extensions = array('.png', '.gif', '.jpg', '.jpeg');
$extension = strrchr($_FILES['fichierlogo']['name'], '.'); 
//Début des vérifications de sécurité...
if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
     $erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...';
}
if($taille>$taille_maxi)
{
     $erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
     //On formate le nom du fichier ici...
     $fichier = strtr($fichier, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
     if(move_uploaded_file($_FILES['fichierlogo']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
     {
          echo 'Upload effectué avec succès !';
     }
     else //Sinon (la fonction renvoie FALSE).
     {
          echo 'Echec de l\'upload !';
     }
}
else
{
     echo $erreur;
}
//Préparation de l'entête du mail:
$mail_entete = "MIME-Version: 1.0\r\n";
$mail_entete .= "From: {$_POST['name']} "
 ."<{$_POST['email']}>\r\n";
$mail_entete .= 'Reply-To: '.$_POST['email']."\r\n";
$mail_entete .= 'Content-Type: text/plain; charset="iso-8859-1"';
$mail_entete .= "\r\nContent-Transfer-Encoding: 8bit\r\n";
$mail_entete .= 'X-Mailer:PHP/' . phpversion()."\r\n";
// préparation du corps du mail
$mail_corps .= "Bonjour $name\n";
$mail_corps .= "Nous avons bien recu votre demande  et nous vous en remercions.\n";
$mail_corps .= "Voici le recapitulatif de votre demande:\n";

$mail_corps .= "Commande de :\n";
$mail_corps .= "$typecommande\n";
$mail_corps .= "$qte\n";
$mail_corps .= "$choix_couleur_impression_ballon\n";
$mail_corps .= "$couleur\n";
$mail_corps .= "$name\n";
$mail_corps .= "$prenom\n";
$mail_corps .= "$societe\n";
$mail_corps .= "$email\n";
$mail_corps .= "$telephone\n";
$mail_corps .= "$tva\n";
$mail_corps .= "$adresse\n";
$mail_corps .= "$cp\n";
$mail_corps .= "$localite\n";
$mail_corps .= "$email\n";
$mail_corps .= "$devis\n";
$mail_corps .= "$commentaire\n";
$mail_corps .= "Notre service client validera votre demande dans les meilleurs delais.";
$mail_corps .= "$fichierlogo\n";
// envoi du mail
if (mail(MAIL_DESTINATAIRE,MAIL_SUJET,$mail_corps,$mail_entete)) {
 //Le mail est bien expédié message sur page destinataire
 header('Location: form-success.htm');
 exit();
 //Le mail n'a pas été expédié message sur erreur
 header('Location: form-error.htm');
 exit();
}
}
?>
Merci d'avance de m'aider à corriger le code.
Modifié en dernier par moogli le 19 sept. 2016, 13:15, modifié 1 fois.

Mammouth du PHP | 2703 Messages

17 sept. 2016, 22:39

il n'est pas possible de rediriger vers une page après avoir fait un echo. en affichant les erreurs, une erreur apparaitrait.
une solution est de faire une page form-success.htm avec upload réussi et une sans upload.

Petit nouveau ! | 5 Messages

18 sept. 2016, 20:29

bonjour. MErci pour cette réponse. Mais j'arrive à faire les deux actions (envois mail + envois fichier) séparément. Ce que je n'arrive pas, c'est combiner les deux.
Par quel code dois-je remplacer l'Echo ici pour qu'il renvoi vers une page à moi? J'ai essayé avec header('Location: form-success.htm'); mais cela ne fonctionne pas.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 sept. 2016, 13:23

salut,

vire l'affichage des messages pour garder la fonctionnalité de redirection.
<?php
if (move_uploaded_file($_FILES['fichierlogo']['tmp_name'], $dossier . $fichier)) { //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
          echo 'Upload effectué avec succès !';
        } else { //Sinon (la fonction renvoie FALSE).
          echo 'Echec de l\'upload !';
        }
devient par exemple $uploaded = move_uploaded_file($_FILES['fichierlogo']['tmp_name'], $dossier . $fichier) ;

pour le reste utilise la librairie PHPMailer pour envoyer l'email avec la pièce jointe ;)
c'est relativement simple à utiliser et mache le boulot pour les pièces jointes, entêtes etc.

Pour le message d'erreur c'est la même chose il faut l'afficher que si derrière on n'effectue pas de redirection.
et le mieux c'est de l'afficher que sur la page du formulaire ;)

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 5 Messages

19 sept. 2016, 14:58

@Moogli: merci beaucoup, ça fonctionne :-))
Juste une dernière question: est-ce possible d'envoyer le nom du fichier téléchargé sur le serveur dans le mail qui m'est envoyé? Sinon la pour le moment je ne sais pas savoir si le visiteur a laisser un fichier et si oui, lequel.
Merci.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 sept. 2016, 15:02

envoie le fichier dans le mail => https://github.com/PHPMailer/PHPMailer
y a un exemple avec pièce jointe dans la doc en bas de page.

sinon $dossier . $fichier contient ce que tu veux. tu as le risque qu'il soit écrasé si un autre fichier à le même nom.

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 5 Messages

19 sept. 2016, 16:35

Un tout grand merci pour votre aide. Pour le moment ça donne le résultat que je souhaitais. Je vais regarder pour phpmailer. Merci. A bientôt ^^