Comment trouver l'extension d'un fichier en C #?

135

Dans mon application Web (asp.net, c #), je télécharge un fichier vidéo dans une page mais je souhaite télécharger uniquement des vidéos flv. Comment puis-je restreindre la mise en ligne d'autres vidéos d'extension?

Surya sasidhar
la source
1
Si possible, vous souhaitez également vérifier le client, pour éviter les téléchargements inutiles.
Thilo
2
Oui, mais voyez ma réponse ci-dessous - ne comptez PAS sur la vérification côté client - elle sera contournée tôt ou tard. :)
ZombieSheep
4
La vérification côté client n'est pas une protection pour votre serveur, mais une commodité pour l'utilisateur.
Thilo
Accordé. Je conseille simplement au PO de ne pas s'y fier.
ZombieSheep

Réponses:

269

Path.GetExtension

string myFilePath = @"C:\MyFile.txt";
string ext = Path.GetExtension(myFilePath);
// ext would be ".txt"
James
la source
8
Cela permet à quelqu'un de simplement renommer n'importe quel fichier * .flv et de le télécharger. En fonction de vos besoins, vous pouvez également vérifier le type MIME.
David Glenn
Le type MIME n'est-il généralement pas défini en fonction de l'extension de nom de fichier?
Thilo
@Thilo, vous avez raison, mais l'extension peut être modifiée sans changer le type de contenu mime. Le type mime décrit les données contenues dans le fichier, donc il peut être manipulé de manière appropriée voir en.wikipedia.org/wiki/MIME
Mark Dickinson
2
Non, le meilleur moyen est de vérifier le contenu du fichier. Il est nécessaire de vérifier la signature flv.
Marat Faskhiev
Juste pour ajouter à cela, car c'est toujours une réponse populaire - l'argument de type MIME est tout aussi peu sûr que l'extension car les deux peuvent être usurpés. Une combinaison des deux vérifications est probablement une solution raisonnable , mais en fin de compte, si la sécurité est un problème, il devrait y avoir des vérifications plus rigoureuses, par exemple le blocage des fichiers non signés ou l'échantillonnage de contenu.
James
21

Vous pouvez simplement lire le flux d'un fichier

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

Les premiers index 5/6 vous indiqueront le type de fichier. Dans le cas du FLV, ses 70, 76, 86, 1, 5 .

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

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

si isAllowedégale truealors son FLV.

OU

Lire le contenu d'un fichier

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

Les deux / trois premières lettres vous indiqueront le type de fichier.
En cas de FLV, son "FLV ......"

content.StartsWith("FLV")
Mukul Yadav
la source
3
Cela devrait être noté plus haut. Si vous voulez vraiment que votre application fonctionne et que les données ne sont pas fiables, vous devez vérifier le début.
PRMan
7

Sur le serveur, vous pouvez vérifier le type MIME, rechercher le type mime flv ici ou sur google.

Vous devriez vérifier que le type mime est

video/x-flv

Si vous utilisiez un FileUpload en C # par exemple, vous pourriez faire

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

Je ne sais pas si c'est ce que vous voulez mais:

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

Ou:

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

De plus, si vous en avez un FileInfo fi, vous pouvez simplement faire:

string ext = fi.Extension;

et il contiendra l'extension du fichier (note: il inclura le ., donc un résultat de ce qui précède pourrait être:, .jpg .txtet ainsi de suite ....

Noctis
la source
2

Vous ne pourrez pas restreindre le type de fichier que l'utilisateur télécharge côté client [*]. Vous ne pourrez le faire que du côté serveur. Si un utilisateur télécharge un fichier incorrect, vous ne pourrez le reconnaître qu'une fois le fichier téléchargé. Il n'existe aucun moyen fiable et sûr d'empêcher un utilisateur de télécharger le format de fichier qu'il souhaite.

[*] Oui, vous pouvez faire toutes sortes de choses intelligentes pour détecter l'extension de fichier avant de démarrer le téléchargement, mais ne vous y fiez pas. Quelqu'un va contourner le problème et télécharger ce qu'il veut tôt ou tard.

ZombieMouton
la source
1
Bien qu'il ne puisse pas empêcher un pirate de télécharger ce qu'il veut, il doit quand même vérifier du côté client pour la commodité de l'utilisateur. Les téléchargeurs Flash devraient pouvoir vérifier le type de fichier.
Thilo du
1
Le PO n'a pas mentionné les téléchargeurs Flash (c'est-à-dire les «téléchargeurs écrits en Flash», plutôt que les «téléchargeurs de contenu Flash»). La question est étiquetée avec les balises asp.net et c #, et avec ces choix technologiques, la vérification côté client est limitée et facilement vaincue. :)
ZombieSheep
Pour un site de téléchargement de vidéos, il devrait avoir quelque chose de mieux côté client qu'un formulaire de téléchargement HTML. Les téléchargements de plusieurs Mo sans barre de progression ne sont pas amusants.
Thilo
ok vous dites que la vérification côté client n'est pas très bonne comment puis-je m'enregistrer côté serveur M. ZombieSheep
Surya sasidhar
@Thilo - Je ne pourrais pas être plus d'accord, mais la question concerne un formulaire de téléchargement ASP.net. C'est à l'OP s'il pense que c'est assez bien ou pas.
ZombieSheep
2

Se termine par()

J'ai trouvé une solution alternative chez DotNetPerls que j'ai mieux aimé car elle ne vous oblige pas à spécifier un chemin. Voici un exemple où j'ai rempli un tableau à l'aide d'une méthode personnalisée

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

La méthode ci-dessus fonctionne bien avec Firefox et IE, je suis capable de visualiser tous les types de fichiers comme zip, txt, xls, xlsx, doc, docx, jpg, png

mais quand j'essaye de trouver l'extension de fichier de googlechrome, j'ai échoué.

Papun Sahoo
la source
2

Il convient de mentionner comment supprimer l'extension également en parallèle avec l'obtention de l'extension:

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

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

Cette solution aide également dans le cas de plusieurs extensions comme "Avishay.student.DB"

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