web-dev-qa-db-fra.com

Filtrer les extensions dans le téléchargement de formulaires HTML

J'ai un simple formulaire de téléchargement HTML et je veux spécifier une extension par défaut ("* .drp" par exemple). J'ai lu que la façon de le faire est d'utiliser l'attribut ACCEPT de la balise d'entrée, mais je ne sais pas exactement comment.

<form enctype="multipart/form-data" action="uploader.php" method="POST">
Upload DRP File:
<input name="Upload Saved Replay" type="file" accept="*.drp"/><br />
<input type="submit" value="Upload File" />
</form>

Modifier Je sais que la validation est possible en utilisant javascript, mais j'aimerais que l'utilisateur ne voie que les fichiers ".drp" dans sa boîte de dialogue contextuelle. De plus, je ne me soucie pas beaucoup de la validation côté serveur dans cette application.

41
ripper234

Pour des formats spécifiques comme le vôtre ".drp". Vous pouvez directement transmettre cela dans accept = ". Drp" cela fonctionnera pour cela.

Mais sans " * "

<input name="Upload Saved Replay" type="file" accept=".drp" />
<br/>
34
ParaMeterz

J'utilise javascript pour vérifier l'extension du fichier. Voici mon code:

HTML

<input name="fileToUpload" type="file" onchange="check_file()" >

.. ..

javascript

function check_file(){
                str=document.getElementById('fileToUpload').value.toUpperCase();
        suffix=".JPG";
        suffix2=".JPEG";
        if(str.indexOf(suffix, str.length - suffix.length) == -1||
                       str.indexOf(suffix2, str.length - suffix2.length) == -1){
        alert('File type not allowed,\nAllowed file: *.jpg,*.jpeg');
            document.getElementById('fileToUpload').value='';
        }
    }
27
Nazri

L'attribut accept attend des types MIME, pas des masques de fichier. Par exemple, pour accepter des images PNG, vous devez accepter accept = "image/png". Vous devrez peut-être déterminer le type MIME que le navigateur considère comme votre type de fichier et l'utiliser en conséquence. Cependant, puisqu'un fichier 'drp' n'apparaît pas standard, vous pourrait devez accepter un type MIME générique.

En outre, il semble que la plupart des navigateurs n'honorent pas cet attribut.

La meilleure façon de filtrer les téléchargements de fichiers sera du côté serveur. Cela n'est pas pratique car l'utilisateur occasionnel peut perdre du temps à télécharger un fichier uniquement pour apprendre qu'il a choisi le mauvais, mais au moins vous aurez une certaine forme d'intégrité des données.

Vous pouvez également choisir d'effectuer une vérification rapide avec JavaScript avant d'envoyer le formulaire. Vérifiez simplement l'extension de la valeur du champ de fichier pour voir s'il s'agit de ".drp". Cela va probablement être beaucoup plus pris en charge que l'attribut accept.

10
Brian Cline

Je n'utiliserais pas cet attribut car la plupart des navigateurs l'ignorent comme le souligne CMS.

Par tous les moyens, utilisez la validation côté client, mais uniquement conjointement avec le côté serveur. Toute validation côté client peut être contournée.

Légèrement hors sujet mais certaines personnes vérifient le type de contenu pour valider le fichier téléchargé. Vous devez être prudent à ce sujet car un attaquant peut facilement le modifier et télécharger un fichier php par exemple. Voir l'exemple sur: http://www.scanit.be/uploads/php-file-upload.pdf

1
alexmac

Vous pouvez le faire en utilisant javascript. Saisissez la valeur du champ de formulaire dans votre fonction d'envoi, analysez l'extension.

Vous pouvez commencer avec quelque chose comme ceci:

<form name="someform"enctype="multipart/form-data" action="uploader.php" method="POST">
<input type=file name="file1" />
<input type=button onclick="val()" value="xxxx" />
</form>
<script>
function val() {
    alert(document.someform.file1.value)
}
</script>

Je suis d'accord avec alexmac - faites-le également côté serveur.

L'attribut accept spécifie une liste de types de contenu (types MIME) séparés par des virgules que la cible du formulaire traitera correctement. Malheureusement, cet attribut est ignoré par tous les principaux navigateurs, il n'affecte donc en aucune façon la boîte de dialogue de fichiers du navigateur.

0
John Topley