Verification d'extension

Eléphanteau du PHP | 49 Messages

19 déc. 2013, 01:33

Bonjour,
sur un formulaire permettant aux utilisateurs d'envoyer une annonce sur ma boite mail en y joignant ou pas un fichier image, je tente d'insérer un code pour n'autoriser que les images .png, .gif, .jpg, .btm
// vérification de l'extension ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        $allowed_types = array(
               "image/bmp",
               "image/gif",
               "image/jpeg",
			   "image/png",
    );
    if (!in_array($_FILES['affiche']['type'], $allowed_types))
    die ('FORMAT DE FICHIER INCORRECT');	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Sans ce code, l'envoi d'annonce sans joindre de fichier est possible mais pas de vérification d'extension.
Avec ce code, les extensions sont vérifiées mais obligation de joindre un fichier, ce qui ne m'arrange pas.
Pourriez-vous, s'il vous plait, jeter un coup d'œil à mon code et m'expliquer ce qui ne vas pas.
<?php
$error_types = array( 
1=>'Le fichier téléchargé excède la taille de upload_max_filesize, configurée dans le php.ini.', 
2=>'Le fichier téléchargé est plus lourd que 4 Mo.',
3=>'Le fichier n a été que partiellement téléchargé. ', 
6=>'Un dossier temporaire est manquant.', 
7=>'Échec de l écriture du fichier sur le disque.', 
8=>'Une extension PHP a arrété l envoi de fichier.' 
);
 if (!empty($_POST['nom']) && !empty($_POST['email']) && !empty($_POST['titre']))
 {
      include "libmail.php";
	
	$nom=$_POST['nom'];
	$email=$_POST['email'];
	$titre=$_POST['titre'];
	if (isset($_POST['contenu']))
	$contenu=$_POST['contenu'];
	
	$m= new Mail; // le mail est créé
	$m->From( $_POST['email'] );
	$m->To( "[email protected]" );  // adresse de reception du mail
	$m->Subject( "annonce " );
	$imager = $_FILES['affiche']['tmp_name'];  // nom du fichier temporaire
	$nomimage = $_FILES['affiche']['name'];  // nom réel
	$message= " Nom : ".stripslashes($nom)."\n Email : ".$email."\n Titre :".stripslashes($titre)."\n Message : ".stripslashes($contenu)."\n";
	$m->Body( $message);	// corps du message
	$m->Priority(2) ;	// donne la priorité du mess
	
// vérification de l'extension ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        $allowed_types = array(
               "image/bmp",
               "image/gif",
               "image/jpeg",
			   "image/png",
    );
    if (!in_array($_FILES['affiche']['type'], $allowed_types))
    die ('FORMAT DE FICHIER INCORRECT');	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	   
	   
	// valide avec image
	if (isset($_FILES['affiche']['name'])&&($_FILES['affiche']['error']==0))
		{$m->Attach( "$imager", "$nomimage" ) ;	// attache l image
     $m->Send();	// envoi le mail
    echo" <p/> Votre annonce a été envoyé.</p>";	
}	
	// valide sans image
	elseif (empty($_FILES['affiche']['name']))
		{
     $m->Send();	// envoi le mail
    echo" <p/> Votre annonce a été envoyé. </p>";
} 
	// non valide
	else { 
  $error_message = $error_types[$_FILES['affiche']['error']]; 
  echo  " <p>VOTRE ANNONCE N'A PAS ETE ENVOYE!!! : $error_message </p>" ;
       }
}
 if (isset($_POST['submit'])&&($_POST['submit'] == "                             "))
 {
 // formulaire
 ?>

<script>
function surligne(champ, erreur)
{
   if(erreur)
      champ.style.backgroundColor = "#fba";
   else
      champ.style.backgroundColor = "";
}

function verifNom(champ)
{
   if(champ.value.length < 1)
   {
      surligne(champ, true);
	  alert("Le champ 'Nom' n'est pas rempli");
      return false;
   }
   else
   {
      surligne(champ, false);
      return true;
   }
}

function verifMail(champ)
{
   var regex = /^[a-zA-Z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$/;
   if(!regex.test(champ.value))
   {
      surligne(champ, true);
	  alert("Le champ 'Email' n'est pas rempli ou n'est pas valide");
      return false;
   }
   else
   {
      surligne(champ, false);
      return true;
   }
}

function verifTitre(champ)
{
   if(champ.value.length < 1)
   {
      surligne(champ, true);
	  alert("Le champ 'Titre' n'est pas rempli");
      return false;
   }
   else
   {
      surligne(champ, false);
      return true;
   }
}

function valideForm(f)
{
   var nomOk = verifNom(f.nom);
   var mailOk = verifMail(f.email);
   var titreOk = verifTitre(f.titre);
   
   if(nomOk && mailOk && titreOk)
      return true;
   else
   {
      alert("Veuillez remplir correctement les champs obligatoires");
      return false;
   }
}
</script>

  <div id="corpsform">
  <center><form action="agendatest.php" method="post" enctype="multipart/form-data" onsubmit="return valideForm(this)">
  <table class="center">
  <tr><td>* Nom : </td><td><input type="text" size="30" name="nom" onblur="verifNom(this)" placeholder="Nom" required="required"/></td></tr>
  <tr><td">* Email : </td><td><input type="text" size="30" name="email" id="email1" onblur="verifMail(this)" placeholder="Mail" required="required"/></td></tr>
  <tr><td>* Titre : </td><td><input type="text" size="30" name="titre" onblur="verifTitre(this)" placeholder="Titre" required="required"/></td></tr>
  <tr><td>Affiche : </td><td><input type="hidden" name="MAX_FILE_SIZE" value="4000000" /><input type="file" id="files" name="affiche" accept="image/*"/>
  <output id="list"></output></td></tr>
    <script>
	if (window.FileReader) {
      function handleFileSelect(evt) {
        var files = evt.target.files;
        var f = files[0];
        var reader = new FileReader();
		
          reader.onload = (function(theFile) {
            return function(e) {
              document.getElementById('list').innerHTML = ['<img src="', e.target.result,'" title="', theFile.name, '" width="50"/>'].join('');
            };
          })(f);
    
          reader.readAsDataURL(f);
      }
	 } else {
	  alert('Ce navigateur internet ne supporte pas FileReader');
	}
    
      document.getElementById('files').addEventListener('change', handleFileSelect, false);
    </script>
  <tr><td class="right">Contenu :</td><td class="left"><textarea rows="5" name="contenu" cols="30" onclick='this.value = erase(this.value)' placeholder="Contenu"></textarea></td></tr>
  <tr><td></td><td class="left">* Champs obligatoires.</td></tr> 
 <tr><td colspan="2" class="center"><input type="submit" name="submit" value="Envoyer" /></td></tr>
  </table>
  </form></center>
  </div>

ViPHP
xTG
ViPHP | 7331 Messages

19 déc. 2013, 08:25

Mets ton code sous la condition qui vérifie qu'un fichier est présent :
if (isset($_FILES['affiche']['name'])&&($_FILES['affiche']['error']==0))

Eléphanteau du PHP | 49 Messages

20 déc. 2013, 03:00

Super, ça fonctionne, merci.

ancien code
// vérification de l'extension ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        $allowed_types = array(
               "image/bmp",
               "image/gif",
               "image/jpeg",
                           "image/png",
    );
    if (!in_array($_FILES['affiche']['type'], $allowed_types))
    die ('FORMAT DE FICHIER INCORRECT');       
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
           
           
        // valide avec image
        if (isset($_FILES['affiche']['name'])&&($_FILES['affiche']['error']==0))
                {$m->Attach( "$imager", "$nomimage" ) ; // attache l image
     $m->Send();        // envoi le mail
    echo" <p/> Votre annonce a été envoyé.</p>";    
}      
        // valide sans image
        elseif (empty($_FILES['affiche']['name']))
                {
     $m->Send();        // envoi le mail
    echo" <p/> Votre annonce a été envoyé. </p>";
Nouveau code
// valide avec image
        if (isset($_FILES['affiche']['name'])&&($_FILES['affiche']['error']==0))
                {// vérification de l'extension////////////////////////////////////////////////////////////////////////////////////////////////////////
        $allowed_types = array(
               "image/bmp",
               "image/gif",
               "image/jpeg",
                           "image/png",
    );
    if (!in_array($_FILES['affiche']['type'], $allowed_types))
    die ('FORMAT DE FICHIER INCORRECT');       
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$m->Attach( "$imager", "$nomimage" ) ; // attache l image
     $m->Send();        // envoi le mail
    echo" <p/> Votre annonce a été envoyé.</p>";    
}      
        // valide sans image
        elseif (empty($_FILES['affiche']['name']))
                {
     $m->Send();        // envoi le mail
    echo" <p/> Votre annonce a été envoyé. </p>";

Eléphanteau du PHP | 49 Messages

20 déc. 2013, 03:14

Quelqu'un pourrait m'indiquer comment faire pour annuler la sélection d'un fichier si l'utilisateur décide, après avoir choisit une image, de ne pas l'envoyer dans son annonce.
Je ne parle pas d'un
<input type="reset">
qui réinitialise tout le formulaire, mais seulement vider le
<input type="file">
si un fichier est déjà chargé.
Merci

ViPHP
ViPHP | 2577 Messages

20 déc. 2013, 10:09

Je te conseille la fonction http://www.php.net/manual/fr/function.getimagesize.php pour vérifier le type de fichier.