2009-12-11 15 views
66

In meiner Webanwendung (asp.net, C#) lade ich eine Videodatei auf eine Seite hoch, möchte aber nur FLV-Videos hochladen. Wie kann ich das Hochladen anderer Erweiterungsvideos einschränken?Wie finde ich die Erweiterung einer Datei?

+1

Wenn möglich, möchten Sie auch den Client überprüfen, um unnötige Uploads zu vermeiden. – Thilo

+2

Ja, aber sehen Sie meine Antwort unten - verlassen Sie sich nicht auf die Überprüfung auf der Client-Seite - es wird früher oder später umgangen werden. :) – ZombieSheep

+3

Die clientseitige Überprüfung ist kein Schutz für Ihren Server, sondern ein Komfort für den Benutzer. – Thilo

Antwort

146

Path.GetExtension

string myFilePath = @"C:\MyFile.txt"; 
string ext = Path.GetExtension(myFilePath); 
// ext would be ".txt" 
+0

Vielen Dank Herr James es funktioniert gut Vielen Dank für die Antwort –

+6

Dies ermöglicht jemand nur eine Datei * .flv umzubenennen und hochzuladen. Abhängig von Ihren Anforderungen möchten Sie möglicherweise auch den MIME-Typ überprüfen. –

+0

Wird der MIME-Typ normalerweise nicht entsprechend der Dateinamenerweiterung festgelegt? – Thilo

7

Auf dem Server Sie hier oder auf Google MIME-Typ, Lookup flv MIME-Typ überprüfen.

Sie sollten überprüft werden, dass der Mime-Typ

video/x-flv 

ist Wenn Sie einen Fileupload in C# zum Beispiel verwendet haben, könnten Sie

FileUpload.PostedFile.ContentType == "video/x-flv" 
6

tun bin ich nicht sicher, ob dies ist, was Sie wollen, aber:

Directory.GetFiles(@"c:\mydir", "*.flv"); 

Oder:

Path.GetExtension(@"c:\test.flv") 
+0

danke Mr. Carra es funktioniert –

2

Sie können den Dateityp, den der Benutzer auf der Clientseite [*] hochlädt, nicht einschränken. Sie können dies nur auf der Serverseite tun. Wenn ein Nutzer eine falsche Datei hochlädt, können Sie nur erkennen, dass die Datei hochgeladen wurde. Es gibt keine zuverlässige und sichere Möglichkeit, einen Benutzer anzuhalten, das gewünschte Dateiformat hochzuladen.

[*] Ja, Sie können alle möglichen cleveren Dinge tun, um die Dateierweiterung zu erkennen, bevor Sie den Upload starten, aber verlassen Sie sich nicht darauf. Irgendjemand wird sich darum kümmern und früher oder später hochladen, was immer sie wollen.

+1

Während er nicht verhindern kann, dass ein Hacker, was er will hochladen, sollte er immer noch auf der Client-Seite als eine Annehmlichkeit für den Benutzer überprüfen. Flash-Uploader sollten den Dateityp überprüfen können. – Thilo

+1

Das OP erwähnte keine Flash-Uploader (das sind "in Flash geschriebene Uploader" und nicht "Uploader von Flash-Inhalten"). Die Frage wird mit asp.net und C# -Tags markiert, und mit diesen Technologieoptionen ist die clientseitige Überprüfung begrenzt und leicht zu besiegen. :) – ZombieSheep

+0

Für eine Video-Upload-Website sollte er auf der Client-Seite etwas besseres haben als ein HTML-Upload-Formular. Multi-MB-Uploads ohne Fortschrittsbalken machen keinen Spaß. – Thilo

0

Darüber hinaus, wenn Sie eine FileInfo fi haben, können Sie einfach tun:

string ext = fi.Extension; 

und es wird die Erweiterung der Datei (Note halten: es wird die . umfassen, so ein Ergebnis der oben sein könnte: .jpg.txt, und so weiter ....

8

Sie einfach den Strom einer Datei lesen kann

using (var target = new MemoryStream()) 
     { 
      postedFile.InputStream.CopyTo(target); 
      var array = target.ToArray(); 

Erste 5/6 Indizes geben Ihnen den Dateityp an. Bei FLV ist

private statische Readonly Byte [] FLV = {70, 76, 86, 1, 5};

Just do - var isAllowed = array.Take(5).SequenceEqual(FLV); 

wenn ja dann seine FLV.

ODER

Lesen Sie den Inhalt einer Datei

var contentArray = target.GetBuffer(); 
       var content = Encoding.ASCII.GetString(contentArray); 

ersten zwei/drei Buchstaben, die Sie den Dateityp wird es zeigen. Im Fall von FLV seine

"FLV | \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 ......"

Just do - content.StartsWith("FLV") 
+1

Dies sollte höher eingestuft werden. Wenn Sie wirklich möchten, dass Ihre Anwendung funktioniert und die Daten nicht vertrauenswürdig sind, sollten Sie den Anfang überprüfen. – PRMan

0

Diese Lösung auch in Fällen von mehr als eine Erweiterung hilft wie „Avishay.student.DB“

   FileInfo FileInf = new FileInfo(filePath); 
       string strExtention = FileInf.Name.Replace(System.IO.Path.GetFileNameWithoutExtension(FileInf.Name), ""); 
0

EndsWith()

eine alternative Lösung über bei DotNetPerls gefunden, dass ich es besser gefallen, weil es Sie nicht benötigen, um einen Pfad angeben Hier ist ein Beispiel, wo ich ein Array mit Hilfe einer benutzerdefinierten Methode

bevölkerte
 // This custom method takes a path 
     // and adds all files and folder names to the 'files' array 
     string[] files = Utilities.FileList("C:\", ""); 
     // Then for each array item... 
     foreach (string f in files) 
     { 
      // Here is the important line I used to ommit .DLL files: 
      if (!f.EndsWith(".dll", StringComparison.Ordinal)) 
       // then populated a listBox with the array contents 
       myListBox.Items.Add(f); 
     } 
0
string FileExtn = System.IO.Path.GetExtension(fpdDocument.PostedFile.FileName); 

Die obige Methode funktioniert gut mit dem Firefox und IE, ich bin in der Lage, alle Arten von Dateien wie zip, txt zu sehen, xls, xlsx, doc, docx, jpg, png

aber wenn ich versuche, die Erweiterung der Datei von googlechrome zu finden, schlug ich fehl.

Verwandte Themen