Como encontrar a extensão de um arquivo em C #?


135

No meu aplicativo da web (asp.net, c #), estou carregando um arquivo de vídeo em uma página, mas quero carregar apenas vídeos flv. Como posso restringir quando envio outros vídeos de extensão?


1
Se possível, você também deseja verificar o cliente, para evitar envios desnecessários.
Thilo

2
Sim, mas veja minha resposta abaixo - NÃO confie na verificação do lado do cliente - ela será contornada mais cedo ou mais tarde. :)
ZombieSheep

4
A verificação do lado do cliente não é uma proteção para o seu servidor, mas uma conveniência para o usuário.
Thilo

Concedido. Estou apenas aconselhando o OP a não confiar nele.
ZombieSheep

Respostas:


269

Path.GetExtension

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

8
Isso permite que alguém renomeie qualquer arquivo * .flv e faça o upload. Dependendo de quais são seus requisitos, convém verificar também o tipo MIME.
11119 David Glenn

O tipo MIME geralmente não é definido de acordo com a extensão do nome do arquivo?
Thilo

@ Thilo, você está certo, mas a extensão pode ser alterada sem alterar o tipo de conteúdo MIME. O tipo mime descreve os dados contidos no arquivo, para que possa ser manuseado adequadamente ver en.wikipedia.org/wiki/MIME
Mark Dickinson

2
Não, a melhor maneira é verificar o conteúdo do arquivo. É necessário verificar a assinatura flv.
Marat Faskhiev 11/12/2009

Só para adicionar isso, já que ainda é uma resposta popular - o argumento do tipo MIME é tão inseguro quanto a extensão, pois ambos podem ser falsificados. Uma combinação de ambas as verificações é provavelmente uma solução razoável , mas se a segurança for uma preocupação, deve haver verificações mais rigorosas, por exemplo, bloqueio de arquivos não assinados ou amostragem de conteúdo.
James

21

Você pode simplesmente ler o fluxo de um arquivo

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

Os primeiros 5/6 índices informarão o tipo de arquivo. No caso de FLV, seus 70, 76, 86, 1, 5 .

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

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

se for isAllowedigual a trueseu FLV.

OU

Leia o conteúdo de um arquivo

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

As primeiras duas / três letras indicam o tipo de arquivo.
No caso de FLV, seu "FLV ......"

content.StartsWith("FLV")

3
Isso deve ser classificado como mais alto. Se você realmente deseja que seu aplicativo funcione e os dados não sejam confiáveis, verifique o início.
PRMan

7

No servidor, você pode verificar o tipo MIME, pesquisa flv mime type aqui ou no google.

Você deve verificar se o tipo MIME é

video/x-flv

Se você estivesse usando um FileUpload em C #, por exemplo, você poderia fazer

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

5

Não tenho certeza se é isso que você deseja, mas:

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

Ou:

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

4

Além disso, se você tiver um FileInfo fi, pode simplesmente:

string ext = fi.Extension;

e manterá a extensão do arquivo (nota: incluirá o ., portanto, o resultado do acima pode ser:, .jpg .txte assim por diante ....


2

Você não poderá restringir o tipo de arquivo que o usuário carrega no lado do cliente [*]. Você só poderá fazer isso no lado do servidor. Se um usuário fizer o upload de um arquivo incorreto, você poderá reconhecer apenas que após o upload do arquivo. Não há uma maneira confiável e segura de impedir que um usuário faça o upload do formato de arquivo desejado.

[*] sim, você pode fazer todos os tipos de coisas inteligentes para detectar a extensão do arquivo antes de iniciar o upload, mas não confie nela. Alguém irá contorná-lo e enviar o que quiser mais cedo ou mais tarde.


1
Embora ele não possa impedir que um hacker carregue o que deseja, ele ainda deve verificar o lado do cliente como uma conveniência para o usuário. Uploaders em Flash devem poder verificar o tipo de arquivo.
Thilo

1
O OP não mencionou os uploaders em Flash (ou seja, 'uploaders escritos em Flash', em vez de 'uploaders de conteúdo em Flash'). A pergunta está marcada com as tags asp.net e c # e, com essas opções de tecnologia, a verificação do lado do cliente é limitada e facilmente derrotada. :)
ZombieSheep

Para um site de upload de vídeo, ele deve ter algo melhor no lado do cliente do que um formulário de upload em HTML. Uploads de vários MB sem uma barra de progresso não são divertidos.
Thilo

ok você está dizendo que o check lado do cliente que não é muito bom como eu pode verificar no lado do servidor Mr. ZombieSheep
Surya sasidhar

@ Thilo - Eu não poderia concordar mais, mas a pergunta é sobre um formulário de upload do ASP.net. Cabe ao OP se ele acha que isso é bom o suficiente ou não.
ZombieSheep


2

Termina com()

Encontrei uma solução alternativa no DotNetPerls que eu mais gostei, porque não exige que você especifique um caminho. Aqui está um exemplo em que eu preenchi uma matriz com a ajuda de um método personalizado

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

O método acima funciona bem com o firefox e o IE, eu consigo visualizar todos os tipos de arquivos como zip, txt, xls, xlsx, doc, docx, jpg, png

mas quando tento encontrar a extensão de arquivo do googlechrome, falhei.


2

Vale mencionar como remover a extensão também em paralelo com a obtenção da extensão:

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

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

0

Esta solução também ajuda em casos de mais de uma extensão como "Avishay.student.DB"

                FileInfo FileInf = new FileInfo(filePath);
                string strExtention = FileInf.Name.Replace(System.IO.Path.GetFileNameWithoutExtension(FileInf.Name), "");
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.