Tester la présence de fichier dans un input de type file

Par bingbongbam, il y a 12 ans


bonjour,
je possède un formulaire avec upload de fichier.
il déclenche une action "traitement.php", mais je voudrais pouvoir tester si l'utilisateur a bien sélectionner un fichier avant de traiter mon action "traitement.php" et en indiquant un span erreur si aucun fichier n'est sélectionner.
cdt crazyman.

8 réponses

Glaived, il y a 12 ans
if(isset($_FILES'monfichier']) AND $_FILES'monfichier']'error'] == 0)

monfichier correspond à

<input type="file" name="monfichier">

J'ai ouvert Google

Garniture-banner, il y a 12 ans

Pas sur qu'une vérification en php soit la solution, je péconise un peu de JS juste avant d'envoyer.
Avec ton bouton envoyer qui à comme name "submit" sa donne:

$("#submit").click(function(){
    var fileName = $("#file").val();
    if(fileName.length != 0)
        //On continue, l'input n'est pas vide
    else
        // Mets une claque à ton utilisateur, puis 
        // $("#file").append('<span> You must send a file </span>');
})

Pour pleins de raisons si c'est sur le bouton envoyer du formulaire que tu vérifies,faire un

e.preventDefault()

est judicieux

bingbongbam, il y a 12 ans

Bonjour et merci beaucoup pour les réponses,
je suis ennuyer j'essaye en vain de comprendre pourquoi ce code ne fonctionne pas !
Avec la technique de Garniture-banner

$("#check").click(function(){
    var fileName = $("#file1").val();
    if(fileName.lastIndexOf("png")===fileName.length-3)
        alert("OK");
    else
        alert("Not PNG");
})

et en html

<form>
<input type="file" name="files" id="file1" style="color:White" />
<input type="submit" value="Create" />
</form>
<button value="check" id="check" name="check" >check</button>

il fonctionne sur ce site mais quand j'essaye de l'utiliser rien quand copie conforme il ne fonctionne pas en local pourtant j'ai bien si cela a un rapport jquery2.1.1,
En gros pour le tester en local ca donnerais cela

<!DOCTYPE html>
<html lang="en">
  <head>
    <?php include 'tete.php' ?>
    <script type="text/javascript">
$("#check").click(function(){
    var fileName = $("#file1").val();
    if(fileName.lastIndexOf("png")===fileName.length-3)
        alert("OK");
    else
        alert("Not PNG");
})
    </script>
    <title>Contact</title>
    <style type="text/css">
    </style>
  </head>
  <body>
    <div class="container">
      <?php include 'menu.php' ?>
        <div class="jumbotron">
                <h2>Garage</h2>
            <form>
            <input type="file" name="files" id="file1" style="color:black" />
            <input type="submit" value="Create" style="margin:10px; width:80px; height:45px;"/>
            </form>
            <button value="check" id="check" name="check" style="margin:10px; width:80px; height:45px;">check</button>
        </div>
      <?php include 'pied.php' ?>
    </div>   
  </body>
</html>

Mais ca ne fonctionne pas, avez vous une idée merci beaucoup pour le temps accordés
Crazyman

Garniture-banner, il y a 12 ans

Passe tes scripts à la fin du body meme si sa ne sert plus à rien et que c'est old-school, sa choque moins.

Essaie d'éviter le comportement par défaut du navigateur avec un preventDefault().

$("#check").click(function(e){
    e.preventDefault();
    var fileName = $("#file1").val();
    if(fileName.lastIndexOf("png")===fileName.length-3)
        alert("OK");
    else
        alert("Not PNG");
})

Une autre amélioration:
Essaie de vérifier avec une regex filename.match(/([a-zA-Z0-9_])+.(png|jpeg|jpg)/) (Affine la regex en fonction de tes besoins )

bingbongbam, il y a 12 ans

Je suis mauvais en js ses fou...
Un regex pourquoi pas mais je veux juste filtrer sont extension.
Je n'arrive même pas à adapter le code pour qu'il accepte plusieurs condition genre png jpg jpeg gif puis qu'il charge mon fichier php.
Sa me *** ***** je déteste demander de l'aide.

Glaived, il y a 12 ans

Je n'arrive même pas à adapter le code pour qu'il accepte plusieurs condition genre png jpg jpeg gif puis qu'il charge mon fichier php.

Google is your friend ^^

Vallyan, il y a 12 ans

Comme toujours, la verification en JS c'est du luxe, c'est d'abord en PHP qu'il faut faire les checks a la reception de formulaires.

En PHP:

$allowedExtensions = array('gif','png' ,'jpg', 'jpeg'); // Liste les extensions autorisées
$extension = pathinfo($_FILES'files']'name'], PATHINFO_EXTENSION); // Récupère l'extension du fichier uploadé
if( in_array(strtolower($extension) ,$allowedExtensions) ) {
// C'est une extension autorisée, tu peux faire ton truc (note l'utilisation de strtolower si jamais c'est une extension en majuscule)
} else {
// C'est pas une extension autorisé, tu le renvoies le formulaire dans la face
}

Pour le JS, une regex, comme le dit Garniture-banner fait parfaitement l'affaire. Un truc du genre (fait très simplement, tu as sans doute d'autres verifications a faire):

$('form').submit(function(e){
    if ( $("input[name='files']").val().match(/.+\.(png|jpg|jpeg|gif)$/i) )
        return; // Autorise la soumission
    e.preventDefault(); // Empeche la soumission
})

Petit codepen pour voir comment ca marche: http://codepen.io/anon/pen/Bflkc

Glaived, il y a 12 ans

Comme toujours, la verification en JS c'est du luxe, c'est d'abord en PHP qu'il faut faire

+1, le traitement serveur est indispensable