Frage

Ich verwende <input type="file" id="fileUpload" runat="server"> eine Datei in einer ASP.NET-Anwendung zu laden. Ich möchte den Dateityp des Upload begrenzen (Beispiel: Begrenzung .xls oder .xlsx Dateierweiterungen).

Sowohl JavaScript oder serverseitige Validierung sind OK (solange die serverseitige Validierung stattfinden würde, bevor die Dateien hochgeladen werden - könnte es einige sehr großen Dateien hochgeladen werden, so dass jede Validierung muss vor der eigentlichen Datei nehmen hochgeladen werden).

War es hilfreich?

Lösung

Scheint, wie Sie nur begrenzte Möglichkeiten haben werden, da Sie die Prüfung auftreten vor dem Upload werden sollen. Ich denke, das Beste, was Sie sich erhalten ist Javascript zu verwenden, um die Erweiterung der Datei zu bestätigen. Sie könnten einen Hash der gültigen Erweiterungen bauen und dann zu sehen, ob die Erweiterung der Datei in dem Hash existierte hochgeladen werden.

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

Andere Tipps

Es ist ziemlich einfach regulare Ausdruck Prüfung verwendet werden.

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

clientseitige Validierung von Datei Typen Zulässige zum hochladen

Von JavaScript aktivieren, sollten Sie in der Lage sein, die Dateinamen in dem onsubmit Handler zu bekommen. Also in Ihrem Fall sollten Sie so etwas wie:

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

ich mit Chris einverstanden ist, die Erweiterung Überprüfung ist nicht Validierung des Dateitypen jede mögliche Weise man es betrachtet. Telerik radUpload ist wahrscheinlich die beste Wahl, es bietet Contenttype-Eigenschaft der Datei hochgeladen werden, die Sie zu bekannten MIME-Typen zu vergleichen. Sie sollten überprüfen:

application / vnd.ms-excel,

application / excel,

application / x-msexcel

und für das neue 2k7 Format:

application / vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik verwendet radUpload als Einzelkomponente zu verkaufen, aber seine jetzt in die Kontrollen Suite gewickelt, die es ein wenig teurer macht, aber bei weitem seine der einfachste Weg für den wahren Typ zu überprüfen

Sie einen regulären Ausdruck Validator auf dem 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 akzeptieren Attribut des Eingangs-Tag:

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

, aber ich hatte nicht viel Erfolg, wenn ich das versucht (mit FF3 und IE7)

Wie einige Leute schon erwähnt haben, ist Javascript der Weg zu gehen. Denken Sie daran, dass die „Validierung“ ist hier nur nach Dateierweiterung, wird es nicht bestätigen, dass die Datei ist eine echte Excel-Tabelle!

Basierend auf kd7 Antwort darauf hindeutet, Sie für die Inhaltstyp-Dateien zu überprüfen, hier ist 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 Datei .xls hochladen oder .xlsx

Stellen Sie sicher, dass Sie immer für die Dateierweiterung Check-in Server-Seite, um sicherzustellen, dass niemand eine schädlichen Dateien hochladen wie ASPX, .asp etc.

Nun -. Sie werden nicht in der Lage sein, es serverseitige über die Post-back zu tun, wie die Datei (hochgeladen) während der Post-back vorgelegt wird erhalten

Ich glaube, Sie in der Lage sein, können es auf dem Client mit Hilfe von JavaScript zu tun. Persönlich benutze ich einen Dritten Komponente namens radUpload von Telerik . Es hat eine gute clientseitige und serverseitige API, und es bietet einen Fortschrittsbalken für große Datei-Uploads.

Ich bin sicher, es gibt Open-Source-Lösungen zur Verfügung, auch.

Ich denke, es gibt verschiedene Wege, dies zu tun. Da im nicht vertraut mit asp kann ich Ihnen nur einige Hinweise für einen bestimmten Dateityp zu überprüfen:

1) der sichere Weg: mehr Informationen über den Header der Datei des Typs erhalten Sie weitergeben möchten. analysieren die hochgeladene Datei und vergleichen Sie die Header

2) der schnelle Weg: spaltete den Namen der Datei in zwei Teile -> Name der Datei und das Ende der Datei. überprüfen Sie die Endung der Datei aus und vergleichen Sie es mit dem Dateityp Sie zulassen möchten hochgeladen werden

hoffe, es hilft:)

Vermeiden Sie die Standardsteuerung Asp.Net und verwenden Sie die NeadUpload Komponente aus Brettle Entwicklung: http: //www.brettle .com / neatupload

Schneller, einfacher zu bedienen, keine Sorgen um die maxRequestLength Parameter in Konfigurationsdateien und sehr einfach zu integrieren.

Als Alternative könnten Sie die „akzeptieren“ -Attribut von HTML-Dateieingabe, die definiert, welche MIME-Typen akzeptabel sind.

Definition hier

Ihre einzige Option scheint die clientseitige Validierung zu sein, weil Serverseite bedeutet, wurde die Datei bereits hochgeladen. Auch der MIME-Typ ist in der Regel durch die Dateierweiterung diktiert.

einen JavaScript-Framework wie jQuery verwenden, um das onsubmit-Ereignis des Formulars zu überlasten. Dann überprüfen Sie die Erweiterung. Dies wird die meisten Versuche beschränken. Allerdings, wenn eine Person ein Bild Erweiterung XLS ändert, dann werden Sie ein Problem haben.

Ich weiß nicht, ob dies eine Option für Sie, aber Sie mehr Clientseite Kontrolle haben, wenn so etwas wie Silverlight oder Flash mit hochladen. Sie können prüfen, für Ihren Upload-Prozess eine dieser Technologien.

Als eine andere Befragte Notizen kann der Dateityp gefälscht werden (zB .exe .pdf umbenannt), die für den MIME-Typ überprüft wird verhindert, dass nicht (dh, wird die Exe zeigen einen MIME von „application / pdf“, wenn umbenannt als .pdf). Ich glaube, dass eine Überprüfung des tatsächlichen Dateitypen kann nur Serverseite durchgeführt werden; eine einfache Möglichkeit, es mit System.IO.BinaryReader zu prüfen ist 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 den Dateityp wissen müssen (s), nach dem Sie überprüft, aber man kann sie erhalten, indem die Implementierung dieser Lösung und den Code debuggen.

Client Side Validierungsprüfmechanismus: -

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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top