Wie finde ich die Erweiterung einer Datei in C #?

134

In meiner Webanwendung (asp.net, c #) lade ich eine Videodatei auf einer Seite hoch, möchte aber nur flv-Videos hochladen. Wie kann ich einschränken, wenn ich andere Erweiterungsvideos hochlade?

Surya sasidhar
quelle
1
Wenn möglich, möchten Sie auch den Client überprüfen, um unnötige Uploads zu vermeiden.
Thilo
2
Ja, aber siehe meine Antwort unten - verlassen Sie sich NICHT auf die clientseitige Überprüfung - sie wird früher oder später umgangen. :)
ZombieSheep
4
Die clientseitige Überprüfung ist kein Schutz für Ihren Server, sondern eine Annehmlichkeit für den Benutzer.
Thilo
Gewährt. Ich rate dem OP nur, sich nicht darauf zu verlassen.
ZombieSheep

Antworten:

268

Path.GetExtension

string myFilePath = @"C:\MyFile.txt";
string ext = Path.GetExtension(myFilePath);
// ext would be ".txt"
James
quelle
8
Auf diese Weise kann jemand eine beliebige Datei * .flv umbenennen und hochladen. Abhängig von Ihren Anforderungen möchten Sie möglicherweise auch den MIME-Typ überprüfen.
David Glenn
Wird der MIME-Typ normalerweise nicht entsprechend der Dateinamenerweiterung festgelegt?
Thilo
@Thilo, Sie haben Recht, aber die Erweiterung kann geändert werden, ohne den MIME-Inhaltstyp zu ändern. Der MIME-Typ beschreibt die in der Datei enthaltenen Daten, sodass sie angemessen behandelt werden können. Siehe en.wikipedia.org/wiki/MIME
Mark Dickinson
2
Nein, der bessere Weg ist, den Dateiinhalt zu überprüfen. Es ist notwendig, die flv-Signatur zu überprüfen.
Marat Faskhiev
Nur um dies zu ergänzen, da es immer noch eine beliebte Antwort ist - das Argument vom Typ MIME ist genauso unsicher wie die Erweiterung, da beide gefälscht werden können. Eine Kombination beider Überprüfungen ist wahrscheinlich eine vernünftige Lösung. Wenn jedoch die Sicherheit ein Problem darstellt, sollten strengere Überprüfungen durchgeführt werden, z. B. das Blockieren nicht signierter Dateien oder das Abtasten von Inhalten.
James
21

Sie können einfach den Stream einer Datei lesen

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

Die ersten 5/6-Indizes geben Auskunft über den Dateityp. Im Falle von FLV sind es 70, 76, 86, 1, 5 .

private static readonly byte[] FLV = { 70, 76, 86, 1, 5};

bool isAllowed = array.Take(5).SequenceEqual(FLV);

wenn isAllowedgleich truedann sein FLV.

ODER

Lesen Sie den Inhalt einer Datei

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

Die ersten zwei / drei Buchstaben geben den Dateityp an.
Im Falle von FLV ist es "FLV ......"

content.StartsWith("FLV")
Mukul Yadav
quelle
3
Dies sollte höher bewertet werden. Wenn Sie wirklich möchten, dass Ihre Anwendung funktioniert und die Daten nicht vertrauenswürdig sind, sollten Sie den Anfang überprüfen.
PRMan
7

Auf dem Server können Sie hier oder bei Google den MIME-Typ und den MIM-Typ nachschlagen.

Sie sollten überprüfen, ob der MIME-Typ ist

video/x-flv

Wenn Sie beispielsweise einen FileUpload in C # verwenden, können Sie dies tun

FileUpload.PostedFile.ContentType == "video/x-flv"
Mark Dickinson
quelle
5

Ich bin mir nicht sicher, ob Sie das wollen, aber:

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

Oder:

Path.GetExtension(@"c:\test.flv")
Carra
quelle
4

Wenn Sie eine haben FileInfo fi, können Sie außerdem einfach Folgendes tun:

string ext = fi.Extension;

und es wird die Erweiterung der Datei enthalten (Hinweis: Es wird die enthalten ., so dass ein Ergebnis der oben genannten sein könnte: .jpg .txtund so weiter ....

Noctis
quelle
2

Sie können den Dateityp, den der Benutzer auf der Clientseite hochlädt, nicht einschränken [*]. Dies ist nur auf der Serverseite möglich. Wenn ein Benutzer eine falsche Datei hochlädt, können Sie dies erst erkennen, wenn die Datei hochgeladen wurde. Es gibt keine zuverlässige und sichere Möglichkeit, einen Benutzer daran zu hindern, das gewünschte Dateiformat hochzuladen.

[*] Ja, Sie können alle möglichen cleveren Dinge tun, um die Dateierweiterung zu erkennen, bevor Sie mit dem Hochladen beginnen, aber verlassen Sie sich nicht darauf. Jemand wird es umgehen und früher oder später hochladen, was er will.

ZombieSheep
quelle
1
Obwohl er einen Hacker nicht daran hindern kann, das hochzuladen, was er möchte, sollte er dies dennoch auf der Client-Seite überprüfen, um es dem Benutzer zu erleichtern. Flash-Uploader sollten in der Lage sein, den Dateityp zu überprüfen.
Thilo
1
Das OP erwähnte keine Flash-Uploader (dh "in Flash geschriebene Uploader" anstelle von "Uploadern von Flash-Inhalten"). Die Frage ist mit asp.net- und c # -Tags versehen, und bei diesen Technologieoptionen ist die clientseitige Überprüfung begrenzt und kann leicht besiegt werden. :)
ZombieSheep
Für eine Video-Upload-Site sollte er auf der Clientseite etwas Besseres haben als ein HTML-Upload-Formular. Multi-MB-Uploads ohne Fortschrittsbalken machen keinen Spaß.
Thilo
Ok, Sie sagen, dass die clientseitige Überprüfung nicht so gut ist. Wie kann ich die serverseitige Überprüfung einchecken
?
@Thilo - Ich könnte nicht mehr zustimmen, aber die Frage bezieht sich auf ein ASP.net-Upload-Formular. Es liegt an der OP, ob er das für gut genug hält oder nicht.
ZombieSheep
2

Endet mit()

Bei DotNetPerls wurde eine alternative Lösung gefunden , die mir besser gefallen hat, da Sie keinen Pfad angeben müssen. Hier ist ein Beispiel, in dem ich ein Array mithilfe einer benutzerdefinierten Methode gefüllt habe

        // 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);
        }
Megamaiku
quelle
2
string FileExtn = System.IO.Path.GetExtension(fpdDocument.PostedFile.FileName);

Die obige Methode funktioniert gut mit Firefox und IE. Ich kann alle Arten von Dateien wie zip, txt, xls, xlsx, doc, docx, jpg, png anzeigen

aber als ich versuche, die Dateierweiterung von googlechrome zu finden, bin ich gescheitert.

Papun Sahoo
quelle
2

Es ist erwähnenswert, wie die Erweiterung auch parallel zum Abrufen der Erweiterung entfernt werden kann:

var name = Path.GetFileNameWithoutExtension(fileFullName); // Get the name only

var extension = Path.GetExtension(fileFullName); // Get the extension only
Mohammed Noureldin
quelle
0

Diese Lösung hilft auch bei mehr als einer Erweiterung wie "Avishay.student.DB".

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