web-dev-qa-db-fra.com

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

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: limiter à des extensions de fichier .xls ou .xlsx). 

La validation JavaScript ou côté serveur est correcte (tant que la validation côté serveur a lieu avant le téléchargement des fichiers - il peut y avoir de très gros fichiers téléchargés; toute validation doit donc avoir lieu avant le téléchargement des fichiers réels). .

35
Yaakov Ellis

On dirait que vous allez avoir des options limitées puisque vous voulez que la vérification ait lieu avant le téléchargement. Je pense que le mieux que vous puissiez obtenir est d’utiliser javascript pour valider l’extension du fichier. Vous pouvez créer un hachage d'extensions valides, puis rechercher si l'extension du fichier en cours de téléchargement existe dans le hachage.

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;
      }
}
29
Jamie

C'est assez simple d'utiliser un validateur d'expressions régulières. 

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

Validation côté client des types de fichiers pouvant être téléchargés

26
shailesh

À partir de javascript, vous devriez pouvoir obtenir le nom du fichier dans le gestionnaire onsubmit. Donc, 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>
6
staktrace

Je suis d’accord avec Chris, vérifier que l’extension n’est pas une validation du type de fichier, quelle que soit sa façon de voir les choses. RadUpload de Telerik est probablement votre meilleure option. Il fournit une propriété ContentType du fichier en cours de téléchargement, que vous pouvez comparer aux types MIME connus. Vous devriez vérifier pour:

application/vnd.ms-Excel, 

application/Excel, 

application/x-msexcel 

et pour le nouveau format 2k7:

application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Auparavant, Telerik vendait radUpload en tant que composant individuel, mais il est désormais intégré à la suite de contrôles, ce qui le rend un peu plus cher, mais de loin le moyen le plus simple de vérifier le type réel

6
kd7

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 y a aussi l'attribut accept de la balise input:

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

mais je n'ai pas eu beaucoup de succès quand j'ai essayé cela (avec FF3 et IE7)

4
AlexWilson

Comme certains l’ont mentionné, le javascript est la voie à suivre. Gardez à l'esprit que la "validation" ici n'est que par extension de fichier, cela ne permet pas de confirmer que le fichier est un vrai tableur Excel!

3
Jonathan Arkell

Basé sur la réponse de kd7 vous suggérant de vérifier le type de contenu des fichiers, voici une méthode d'encapsulation:

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;
}

renvoyer true si le fichier à télécharger est .xls ou .xlsx

3
m_cheung

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

2
dr. evil

Eh bien, vous ne pourrez pas le faire côté serveur lors du post-retour, car le fichier sera soumis (chargé) au cours du post-retour.

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

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

1
Chris Roberts

Vous pouvez également utiliser l’attribut "accept" de HTML File Input, qui définit les types MIME acceptables.

Définition ici

1
chillysapien

É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, pas de souci du paramètre maxRequestLength dans les fichiers de configuration et très facile à intégrer.

1
massimogentilini

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

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

2) le moyen rapide: diviser le nom du fichier en deux parties -> nom du fichier et fin du fichier. vérifier la fin du fichier et le comparer au type de fichier que vous souhaitez autoriser pour le téléchargement

j'espère que ça aide :)

1
DeeCee

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

utilisez un framework JavaScript tel que jQuery pour surcharger l'événement onsubmit du formulaire. Puis vérifiez l'extension. Cela limitera la plupart des tentatives. Toutefois, si une personne modifie une image en extension XLS, vous aurez un problème.

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

0
Nick Berardi

Comme le note un autre répondant, le type de fichier peut être usurpé (par exemple, .exe renommé .pdf), ce que la vérification du type MIME n'empêchera pas (par exemple, le fichier .exe affichera un MIME "application/pdf" si renommé. pdf). Je crois qu'une vérification du type de fichier vrai ne peut être faite que du côté serveur; un moyen simple de le vérifier à l'aide de 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 aurez besoin de connaître les «codes» binaires pour le (s) type (s) de fichier que vous recherchez, mais vous pouvez les obtenir en implémentant cette solution et en déboguant le code.

0
Mark_fsg

Vérification de la validation côté client: -

HTML:

<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="btnUpload" runat="server" Text="Upload" OnClientClick = "return ValidateFile()"  OnClick="btnUpload_Click"  />
<br />
<asp:Label ID="Label1" runat="server" Text="" />

Javascript:

<script type ="text/javascript">

    var validFilesTypes=["bmp","gif","png","jpg","jpeg","doc","xls"];

    function ValidateFile()

    {

      var file = document.getElementById("<%=FileUpload1.ClientID%>");

      var label = document.getElementById("<%=Label1.ClientID%>");

      var path = file.value;

      var ext=path.substring(path.lastIndexOf(".")+1,path.length).toLowerCase();

      var isValidFile = false;

      for (var i=0; i<validFilesTypes.length; i++)    
      {    
        if (ext==validFilesTypes[i])    
        {    
            isValidFile=true;    
            break;    
        }    
      }

      if (!isValidFile)    
      {    
        label.style.color="red";    
        label.innerHTML="Invalid File. Please upload a File with" +    
         " extension:\n\n"+validFilesTypes.join(", ");    
      }    
      return isValidFile;    
     }    
</script>
0
Rana