Comment puis-je valider le type de fichier d'un fichier de téléchargement?

J'utilise <input type="file" id="fileUpload" runat="server"> pour télécharger un fichier dans une application ASP.NET. Je voudrais limiter le type de fichier du téléchargement (exemple: limite aux extensions de fichier .xls ou .xlsx).

Le JavaScript ou la validation côté serveur sont OK (aussi longtemps que la validation côté serveur aura lieu avant que les fichiers ne soient téléchargés – il pourrait y avoir des fichiers très volumineux téléchargés, donc toute validation doit avoir lieu avant que les fichiers réels ne soient téléchargés) .

On dirait que vous allez avoir des options limitées car vous souhaitez que le chèque se produise avant le téléchargement. Je pense que le meilleur que vous allez obtenir est d'utiliser javascript pour valider l'extension du fichier. Vous pouvez construire un hachage d'extensions valides, puis chercher à voir si l'extension du fichier en cours de chargement existait dans le hash.

HTML:

 <input type="file" name="FILENAME" size="20" onchange="check_extension(this.value,"upload");"/> <input type="submit" id="upload" name="upload" value="Attach" disabled="disabled" /> 

Javascript:

 var hash = { 'xls' : 1, 'xlsx' : 1, }; function check_extension(filename,submitId) { var re = /\..+$/; var ext = filename.match(re); var submitEl = document.getElementById(submitId); if (hash[ext]) { submitEl.disabled = false; return true; } else { alert("Invalid filename, please select another file"); submitEl.disabled = true; return false; } } 

C'est assez simple en utilisant le validateur d'expression regulare.

 <asp:RegularExpressionValidator id="RegularExpressionValidator1" runat="server" ErrorMessage="Only zip file is allowed!" ValidationExpression ="^.+(.zip|.ZIP)$" ControlToValidate="FileUpload1" > </asp:RegularExpressionValidator> 

Marco Marco d'IndopMotwork Abontage à effet InsopulationsMach

À partir de javascript, vous devriez pouvoir obtenir le nom de fichier dans le gestionnaire d'instructions. Dans votre cas, vous devriez faire quelque chose comme:

 <form onsubmit="if (document.getElementById('fileUpload').value.match(/xls$/) || document.getElementById('fileUpload').value.match(/xlsx$/)) { alert ('Bad file type') ; return false; } else { return true; }">...</form> 

Je suis d'accord avec Chris, en vérifiant que l'extension n'est pas une validation du type de fichier de la façon dont vous l'examinez. RadUpload de Telerik est probablement votre meilleure option, il fournit une propriété ContentType du fichier en cours de chargement, que vous pouvez comparer aux types mime connus. Vous devriez vérifier:

Application / vnd.ms-excel,

Application / excel,

Application / x-msexcel

Et pour le nouveau format 2k7:

Application / vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik vendait radUpload en tant que composant individuel, mais maintenant il est enveloppé dans la suite des contrôles, ce qui en fait un peu plus cher, mais c'est de loin la manière la plus simple de vérifier le type réel

Vous pouvez utiliser un validateur d'expression régulière sur le contrôle de téléchargement:

  <asp:RegularExpressionValidator id="FileUpLoadValidator" runat="server" ErrorMessage="Upload Excel files only." ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.xls|.XLS|.xlsx|.XLSX)$" ControlToValidate="fileUpload"> </asp:RegularExpressionValidator> 

Il existe également l'attribut accept de la balise de saisie:

 <input type="file" accept="application/msexcel" id="fileUpload" runat="server"> 

Mais je n'ai pas eu beaucoup de succès lorsque j'ai essayé ceci (avec FF3 et IE7)

Comme certaines personnes l'ont mentionné, Javascript est le chemin à parcourir. N'oubliez pas que la "validation" est uniquement par extension de fichier, elle ne valera pas que le fichier est une véritable feuille de calcul Excel!

Basé sur la réponse de kd7 suggérant que vous vérifiez le type de contenu des fichiers, voici une méthode wrapper:

 private bool FileIsValid(FileUpload fileUpload) { if (!fileUpload.HasFile) { return false; } if (fileUpload.PostedFile.ContentType == "application/vnd.ms-excel" || fileUpload.PostedFile.ContentType == "application/excel" || fileUpload.PostedFile.ContentType == "application/x-msexcel" || fileUpload.PostedFile.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" //this is xlsx format ) return true; return false; } 

Retourne vrai si le fichier à télécharger est .xls ou .xlsx

Eh bien – vous ne pourrez pas le faire sur le serveur après le retour car le fichier sera envoyé (chargé) pendant le retour.

Je pense que vous pourriez le faire sur le client en utilisant JavaScript. Personnellement, j'utilise un composant tiers appelé radUpload par Telerik . Il possède une bonne API côté client et côté serveur, et elle fournit une barre de progression pour les téléchargements de fichiers importants.

Je suis sûr qu'il existe également des solutions open source.

Je pense qu'il existe différentes façons de le faire. Comme je ne suis pas familier avec asp, je ne peux que vous donner quelques conseils pour vérifier un type de fichier spécifique:

1) le moyen sûr: obtenir plus d'informations sur l'en-tête du type de fichier que vous souhaitez passer. Analysez le fichier téléchargé et comparez les en-têtes

2) le chemin rapide: divisez le nom du fichier en deux parties -> le nom du fichier et la fin du fichier. Vérifiez la fin du fichier et comparez-le au type de fichier que vous souhaitez autoriser à télécharger

J'espère que cela aide 🙂

Évitez le contrôle Asp.Net standard et utilisez le composant NeadUpload de Brettle Development: http://www.brettle.com/neatupload

Plus rapide, plus facile à utiliser, sans se soucier du paramètre maxRequestLength dans les fichiers de configuration et très facile à intégrer.

Assurez-vous que vous vérifiez toujours l'extension du fichier sur le côté serveur pour vous assurer que personne ne peut télécharger un fichier malveillant tel que .aspx, .asp, etc.

En alternative, pouvez-vous utiliser l'attribut "accepter" de l'entrée de fichier HTML qui définit les types MIME acceptables.

Définition ici

Votre seule option semble être la validation côté client, car le côté serveur signifie que le fichier a déjà été téléchargé. En outre, le type MIME est généralement dicté par l'extension du fichier.

Utilisez un framework JavaScript comme jQuery pour surcharger l'événement onsubmit du formulaire. Ensuite, vérifiez l'extension. Cela limitera la plupart des tentatives. Cependant, si une personne change une image à l'extension XLS, vous aurez un problème.

Je ne sais pas si c'est une option pour vous, mais vous avez plus de contrôle côté client lorsque vous utilisez quelque chose comme Silverlight ou Flash pour télécharger. Vous pouvez envisager d'utiliser une de ces technologies pour votre processus de téléchargement.

Comme l'indique un autre répondant, le type de fichier peut être falsifié (p. Ex., .exe renommé .pdf), qui vérifie le type MIME ne s'empêchera pas (c.-à-d. Le .exe affichera un MIME de "application / pdf" s'il est renommé. Pdf). Je crois qu'une vérification du type de fichier vrai ne peut être effectuée que sur le côté serveur; Un moyen simple de le vérifier en utilisant System.IO.BinaryReader est décrit ici:

http://forums.asp.net/post/2680667.aspx

Et la version VB ici:

http://forums.asp.net/post/2681036.aspx

Notez que vous devrez connaître les «codes» binaires pour les types de fichiers que vous recherchez, mais vous pouvez les obtenir en implémentant cette solution et en déboguant le code.

Vous pouvez essayer ceci

 <script> $(document).ready(function () { $('input[type=file]').change(function () { var val = $(this).val().toLowerCase(); var regex = new RegExp("(.*?)\.(docx|doc|pdf|xml|bmp|ppt|xls)$"); if(!(regex.test(val))) { $(this).val(''); alert('Please select correct file format'); } }); }); </script>