Come trovare l'estensione di un file in C #?


135

Nella mia applicazione web (asp.net, c #) sto caricando un file video in una pagina ma voglio caricare solo video flv. Come posso limitare quando carico altri video di estensione?


1
Se possibile, si desidera verificare anche sul client, per evitare caricamenti non necessari.
Thilo,

2
Sì, ma vedi la mia risposta di seguito - NON fare affidamento sul controllo lato client - prima o poi verrà elusa. :)
ZombieSheep l'

4
Il controllo lato client non è una protezione per il tuo server, ma una comodità per l'utente.
Thilo,

Concesso. Sto solo avvisando il PO di non fare affidamento su di esso.
ZombieSheep,

Risposte:


269

Path.GetExtension

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

8
Ciò consente a qualcuno di rinominare qualsiasi file * .flv e caricarlo. A seconda delle tue esigenze, potresti voler controllare anche il tipo MIME.
David Glenn,

Il tipo MIME di solito non viene impostato in base all'estensione del nome file?
Thilo,

@Thilo, hai ragione, ma l'estensione può essere cambiata senza cambiare il tipo di contenuto mime. Il tipo mime descrive i dati contenuti nel file, quindi può essere gestito in modo appropriato. Vedi en.wikipedia.org/wiki/MIME
Mark Dickinson l'

2
No, il modo migliore è controllare il contenuto del file. È necessario controllare la firma FLV.
Marat Faskhiev,

Solo per aggiungere a questo dato che è ancora una risposta popolare - l'argomento tipo MIME è insicuro tanto quanto l'estensione che entrambi possono essere falsificati. Una combinazione di entrambi i controlli è probabilmente una soluzione ragionevole , ma alla fine, se la sicurezza è un problema, dovrebbero esserci controlli più rigorosi, ad esempio il blocco di file non firmati o il campionamento del contenuto.
James,

21

Puoi semplicemente leggere il flusso di un file

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

I primi indici 5/6 ti diranno il tipo di file. In caso di FLV è 70, 76, 86, 1, 5 .

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

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

se è isAlloweduguale al truesuo FLV.

O

Leggi il contenuto di un file

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

Le prime due / tre lettere ti diranno il tipo di file.
Nel caso di FLV il suo "FLV ......"

content.StartsWith("FLV")

3
Questo dovrebbe essere valutato più in alto. Se vuoi davvero che l'applicazione funzioni e che i dati non sono attendibili, dovresti controllare l'inizio.
PRMan,

7

Sul server è possibile controllare il tipo MIME, cercare il tipo flime mime qui o su google.

Dovresti verificare che il tipo mime sia

video/x-flv

Se ad esempio si stesse utilizzando un FileUpload in C #, è possibile farlo

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

5

Non sono sicuro se questo è quello che vuoi ma:

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

O:

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

4

Inoltre, se hai un FileInfo fi, puoi semplicemente fare:

string ext = fi.Extension;

e conterrà l'estensione del file (nota: includerà il ., quindi un risultato di cui sopra potrebbe essere:, .jpg .txte così via ....


2

Non sarai in grado di limitare il tipo di file che l'utente carica sul lato client [*]. Sarai in grado di farlo solo sul lato server. Se un utente carica un file errato, sarai in grado di riconoscerlo solo dopo aver caricato il file. Non esiste un modo affidabile e sicuro per impedire a un utente di caricare il formato file desiderato.

[*] sì, puoi fare tutti i tipi di cose intelligenti per rilevare l'estensione del file prima di iniziare il caricamento, ma non fare affidamento su di esso. Qualcuno lo aggirerà e caricherà prima o poi quello che vogliono.


1
Anche se non può impedire a un hacker di caricare ciò che desidera, dovrebbe comunque controllare sul lato client per comodità dell'utente. Gli uploader Flash dovrebbero poter controllare il tipo di file.
Thilo,

1
L'OP non ha menzionato i caricatori di Flash (ovvero "caricatori scritti in Flash" anziché "caricatori di contenuti Flash"). La domanda è taggata con i tag asp.net e c #, e con quelle scelte tecnologiche, il controllo sul lato client è limitato e facilmente sconfitto. :)
ZombieSheep l'

Per un sito di caricamento video, dovrebbe avere qualcosa di meglio sul lato client di un modulo di caricamento HTML. I caricamenti multi-MB senza barra di avanzamento non sono divertenti.
Thilo,

ok stai dicendo che il controllo sul lato client non è molto buono come posso controllare sul lato server Mr. ZombieSheep
Surya sasidhar,

@Thilo - Non potrei essere più d'accordo, ma la domanda riguarda un modulo di caricamento ASP.net. Dipende dall'OP se pensa che sia abbastanza buono o no.
ZombieSheep l'


2

Finisce con()

Ho trovato una soluzione alternativa su DotNetPerls che mi è piaciuta di più perché non richiede di specificare un percorso. Ecco un esempio in cui ho popolato un array con l'aiuto di un metodo personalizzato

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

2
string FileExtn = System.IO.Path.GetExtension(fpdDocument.PostedFile.FileName);

Il metodo sopra funziona perfettamente con Firefox e Internet Explorer, sono in grado di visualizzare tutti i tipi di file come zip, txt, xls, xlsx, doc, docx, jpg, png

ma quando provo a trovare l'estensione del file da googlechrome, ho fallito.


2

Vale la pena menzionare come rimuovere l'estensione anche in parallelo con ottenere l'estensione:

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

var extension = Path.GetExtension(fileFullName); // Get the extension only

0

Questa soluzione aiuta anche nei casi di più estensioni come "Avishay.student.DB"

                FileInfo FileInf = new FileInfo(filePath);
                string strExtention = FileInf.Name.Replace(System.IO.Path.GetFileNameWithoutExtension(FileInf.Name), "");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.