it-swarm-eu.dev

Wie überprüfe ich den Dateityp eines Datei-Uploads?

Ich benutze <input type="file" id="fileUpload" runat="server">, um eine Datei in eine ASP.NET-Anwendung hochzuladen. Ich möchte den Dateityp des Uploads einschränken (Beispiel: Beschränkung auf .xls- oder .xlsx-Dateierweiterungen). 

Sowohl die JavaScript- als auch die serverseitige Validierung ist in Ordnung (solange die serverseitige Validierung vor dem Hochladen der Dateien stattfinden würde. Möglicherweise werden sehr große Dateien hochgeladen. Daher muss die Validierung vor dem Hochladen der Dateien erfolgen. .

35
Yaakov Ellis

Es scheint, als hätten Sie eingeschränkte Möglichkeiten, da die Überprüfung vor dem Upload erfolgen soll. Ich denke, das Beste, was Sie bekommen werden, ist Javascript zu verwenden, um die Dateierweiterung zu überprüfen. Sie könnten einen Hash gültiger Erweiterungen erstellen und dann prüfen, ob die Erweiterung der hochzuladenden Datei im Hash vorhanden ist.

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

Mit dem Validator für reguläre Ausdrücke ist das ziemlich einfach. 

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

Clientseitige Validierung von zum Hochladen zulässigen Dateitypen

26
shailesh

Sie sollten in Javascript in der Lage sein, den Dateinamen im onsubmit-Handler abzurufen. In Ihrem Fall sollten Sie also Folgendes tun:

<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

Ich stimme mit Chris überein, dass die Überprüfung der Erweiterung keine Überprüfung des Dateityps darstellt, ganz gleich, wie Sie sie betrachten. Teleriks radUpload ist wahrscheinlich die beste Option. Sie bietet eine ContentType-Eigenschaft der hochzuladenden Datei, die Sie mit bekannten MIME-Typen vergleichen können. Sie sollten prüfen, ob:

anwendung/vnd.ms-Excel, 

anwendung/Excel, 

anwendung/X-Msexcel 

und für das neue 2k7-Format:

application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Früher verkaufte Telerik radUpload als einzelne Komponente, nun jedoch in die Steuerungssuite, die es etwas teurer macht, aber es ist bei weitem der einfachste Weg, den wahren Typ zu ermitteln

6
kd7

Sie können einen Validator für reguläre Ausdrücke für das Upload-Steuerelement verwenden:

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

Es gibt auch das Accept-Attribut des Eingabe-Tags:

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

aber ich hatte nicht viel Erfolg, als ich dies versuchte (mit FF3 und IE7)

4
AlexWilson

Wie einige Leute erwähnt haben, ist Javascript der Weg zu gehen. Beachten Sie, dass die "Validierung" hier nur die Dateierweiterung ist. Sie kann nicht bestätigen, dass die Datei eine echte Excel-Tabelle ist!

3
Jonathan Arkell

Basierend auf der Antwort von kd7 wird vorgeschlagen, den Inhaltstyp der Dateien zu überprüfen. Hier eine Wrapper-Methode:

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

gibt true zurück, wenn die hochzuladende Datei .xls oder .xlsx ist

3
m_cheung

Stellen Sie sicher, dass Sie immer auf der Serverseite nach der Dateierweiterung suchen, um sicherzustellen, dass niemand eine schädliche Datei wie .aspx, .asp usw. - hochladen kann.

2
dr. evil

Nun, Sie können es nicht serverseitig auf Postback ausführen, da die Datei während des Postbacks gesendet (hochgeladen) wird.

Ich denke, Sie können dies auf dem Client mit JavaScript tun. Ich persönlich verwende eine Drittanbieter-Komponente namens radUpload von Telerik . Es verfügt über eine gute Client- und Serverseite-API und eine Fortschrittsleiste für das Hochladen von Dateien.

Ich bin mir sicher, dass es auch Open Source-Lösungen gibt.

1
Chris Roberts

Als Alternative können Sie das Attribut "Accept" der HTML-Dateieingabe verwenden, das definiert, welche MIME-Typen zulässig sind.

Definition hier

1
chillysapien

Vermeiden Sie die standardmäßige Asp.Net-Steuerung und verwenden Sie die NeadUpload-Komponente von Brettle Development: http://www.brettle.com/neatupload

Schneller, einfacher zu bedienen, keine Sorge über den Parameter maxRequestLength in Konfigurationsdateien und sehr einfach zu integrieren.

1

Ich denke, dass es verschiedene Wege gibt, dies zu tun. Da ich mit asp nicht vertraut bin, kann ich Ihnen nur einige Hinweise geben, um nach einem bestimmten Dateityp zu suchen:

1) Der sichere Weg: Holen Sie sich weitere Informationen über den Header des Dateityps, den Sie übergeben möchten. analysieren Sie die hochgeladene Datei und vergleichen Sie die Header 

2) Der schnelle Weg: Teilen Sie den Namen der Datei in zwei Teile auf -> Name der Datei und das Ende der Datei. checken Sie das Ende der Datei aus und vergleichen Sie sie mit dem Dateityp, den Sie hochladen möchten

ich hoffe es hilft :)

1
DeeCee

Ihre einzige Option scheint die clientseitige Validierung zu sein, da serverseitig bedeutet, dass die Datei bereits hochgeladen wurde. Auch der MIME-Typ wird normalerweise durch die Dateierweiterung vorgegeben. 

verwenden Sie ein JavaScript-Framework wie jQuery, um das Ereignis onsubmit des Formulars zu überladen. Dann überprüfen Sie die Erweiterung. Dies wird die meisten Versuche einschränken. Wenn jedoch eine Person ein Bild in die Erweiterung XLS ändert, haben Sie ein Problem.

Ich weiß nicht, ob dies eine Option für Sie ist, aber Sie haben mehr Kontrolle auf Clientseite, wenn Sie Silverlight oder Flash zum Hochladen verwenden. Sie können in Betracht ziehen, eine dieser Technologien für den Upload-Prozess zu verwenden.

0
Nick Berardi

Als weitere Antwort des Befragten kann der Dateityp gefälscht werden (z. B. umbenannte .exe .pdf-Datei). Durch die Überprüfung des MIME-Typs wird dies nicht verhindert (dh die .exe-Datei zeigt ein MIME von "application/pdf" an, wenn umbenannt wird. pdf). Ich glaube, eine Überprüfung des wahren Dateityps kann nur serverseitig durchgeführt werden. Eine einfache Methode zur Überprüfung mit System.IO.BinaryReader wird hier beschrieben:

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

und VB Version hier: 

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

Beachten Sie, dass Sie die binären "Codes" für die Dateitypen kennen müssen, nach denen Sie suchen. Sie können sie jedoch erhalten, indem Sie diese Lösung implementieren und den Code debuggen.

0
Mark_fsg

Überprüfung der clientseitigen Validierung: -

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