Question

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

La validation JavaScript ou côté serveur est correcte (à condition que la validation côté serveur ait lieu avant le téléchargement des fichiers - il peut y avoir de très gros fichiers téléchargés, de sorte que toute validation doit avoir lieu avant les fichiers réels. sont téléchargés).

Était-ce utile?

La solution

On dirait que vous allez avoir des options limitées car 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 du javascript pour valider l'extension du fichier. Vous pouvez créer un hachage d'extensions valides, puis regarder 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;
      }
}

Autres conseils

C'est assez simple d'utiliser le validateur d'expressions regulare.

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

Validation du fichier côté client Types autorisés à télécharger

À 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>

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. Le le service radUpload de Telerik est probablement votre meilleure option. Propriété ContentType du fichier en cours de télé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 auparavant radUpload en tant que composant individuel, mais maintenant, il est intégré dans la suite de contrôles, ce qui le rend un peu plus cher, mais de loin le moyen le plus simple de rechercher 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 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é (avec FF3 et IE7)

Comme certains l’ont mentionné, le javascript est la voie à suivre. N'oubliez pas que la & Quot; validation & Quot; C’est uniquement par extension de fichier que le fichier est un vrai tableur Excel, il ne sera pas validé!

Sur la base de 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

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

Eh bien, vous ne pourrez pas le faire côté serveur après la publication car le fichier sera soumis (téléchargé) pendant la publication.

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 certain que des solutions open source sont également disponibles.

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: divisez le nom du fichier en deux parties - > nom du fichier et fin du fichier. vérifiez la fin du fichier et comparez-le au type de fichier que vous souhaitez autoriser à télécharger

espérons 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, ne vous inquiétez pas du paramètre maxRequestLength dans les fichiers de configuration et très facile à intégrer.

Comme alternative, pourriez-vous utiliser le & "accepter &"; attribut de HTML File Input qui définit quels types MIME sont acceptables.

Définition ici

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. Ensuite, 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 disposez de davantage de contrôle côté client lorsque vous utilisez quelque chose comme Silverlight ou Flash pour le téléchargement. Vous pouvez envisager l’utilisation de l’une de ces technologies pour votre processus de téléchargement.

Comme l’a noté un autre répondant, le type de fichier peut être usurpé (par exemple, un fichier .exe renommé .pdf), ce que la vérification du type MIME n’empêchera pas (le fichier .exe affichera un MIME de l’application & / pdf " si renommé en .pdf). Je crois qu'une vérification du type de fichier vrai ne peut être faite que 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 devez connaître les "codes" binaires des types de fichiers que vous recherchez, mais vous pouvez les obtenir en implémentant cette solution et en déboguant le code.

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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top