¿Cómo encontrar la extensión de un archivo en C #?


135

En mi aplicación web (asp.net, c #) estoy cargando un archivo de video en una página pero quiero cargar solo videos flv. ¿Cómo puedo restringir cuando subo otros videos de extensión?


1
Si es posible, también desea verificar el cliente, para evitar cargas innecesarias.
Thilo

2
Sí, pero vea mi respuesta a continuación, NO confíe en la verificación del lado del cliente, se evitará tarde o temprano. :)
ZombieSheep

44
La verificación del lado del cliente no es una protección para su servidor, sino una conveniencia para el usuario.
Thilo

Concedido. Solo estoy aconsejando al OP que no confíe en él.
ZombieSheep

Respuestas:


269

Path.GetExtension

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

8
Esto le permite a alguien cambiar el nombre de cualquier archivo * .flv y subirlo. Dependiendo de cuáles sean sus requisitos, es posible que también desee verificar el tipo MIME.
David Glenn

¿El tipo MIME generalmente no se establece de acuerdo con la extensión del nombre del archivo?
Thilo

@Thilo, tienes razón, pero la extensión se puede cambiar sin cambiar el tipo de contenido MIME. El tipo MIME describe los datos contenidos en el archivo, por lo que puede ser manejado apropiadamente ver en.wikipedia.org/wiki/MIME
Marcos Dickinson

2
No, la mejor manera es verificar el contenido del archivo. Es necesario verificar la firma flv.
Marat Faskhiev

Solo para agregar a esto, ya que sigue siendo una respuesta popular: el argumento de tipo MIME es tan inseguro como la extensión, ya que ambos pueden ser falsificados. Una combinación de ambas verificaciones es probablemente una solución razonable , pero en última instancia, si la seguridad es una preocupación, entonces debería haber verificaciones más rigurosas, por ejemplo, el bloqueo de archivos sin firmar o el muestreo de contenido.
James

21

Simplemente puede leer la secuencia de un archivo

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

Los primeros índices de 5/6 le indicarán el tipo de archivo. En caso de FLV es 70, 76, 86, 1, 5 .

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

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

si isAllowedes igual que truesu FLV.

O

Leer el contenido de un archivo

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

Las primeras dos / tres letras le indicarán el tipo de archivo.
En caso de FLV su "FLV ......"

content.StartsWith("FLV")

3
Esto debería ser calificado más alto. Si realmente desea que su aplicación funcione y los datos no son confiables, debe verificar el comienzo.
PRMan

7

En el servidor puede verificar el tipo MIME, buscar el tipo mime flv aquí o en google.

Debería comprobar que el tipo mime es

video/x-flv

Si estaba usando FileUpload en C #, por ejemplo, podría hacer

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

5

No estoy seguro de si esto es lo que quieres pero:

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

O:

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

4

Además, si tiene un FileInfo fi, simplemente puede hacer:

string ext = fi.Extension;

y mantendrá la extensión del archivo (nota: incluirá el ., por lo que un resultado de lo anterior podría ser:, .jpg .txty así sucesivamente ...


2

No podrá restringir el tipo de archivo que el usuario carga en el lado del cliente [*]. Solo podrá hacer esto en el lado del servidor. Si un usuario carga un archivo incorrecto, solo podrá reconocerlo una vez que el archivo se haya cargado. No hay una forma confiable y segura de evitar que un usuario cargue el formato de archivo que desee.

[*] sí, puedes hacer todo tipo de cosas inteligentes para detectar la extensión del archivo antes de comenzar la carga, pero no confíes en ella. Alguien lo evitará y cargará lo que quiera tarde o temprano.


1
Si bien no puede evitar que un pirata informático cargue lo que quiere, debe verificar el lado del cliente para comodidad del usuario. Los cargadores de Flash deberían poder verificar el tipo de archivo.
Thilo

1
El OP no mencionó los cargadores de Flash (es decir, 'cargadores escritos en Flash', en lugar de 'cargadores de contenido Flash'). La pregunta está etiquetada con etiquetas asp.net y c #, y con esas opciones tecnológicas, la verificación del lado del cliente es limitada y fácil de vencer. :)
ZombieSheep

Para un sitio de carga de videos, debería tener algo mejor en el lado del cliente que un formulario de carga HTML. Las cargas de varios MB sin una barra de progreso no son divertidas.
Thilo

ok, dices que la verificación del lado del cliente no es tan buena, ¿cómo puedo registrarme en el lado del servidor? Sr. ZombieSheep
Surya sasidhar

@Thilo: no podría estar más de acuerdo, pero la pregunta es sobre un formulario de carga ASP.net. Depende del OP si cree que es lo suficientemente bueno o no.
ZombieSheep


2

Termina con()

Encontré una solución alternativa en DotNetPerls que me gustó más porque no requiere que especifique una ruta. Aquí hay un ejemplo en el que completé una matriz con la ayuda de un 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);

El método anterior funciona bien con Firefox e IE, puedo ver todo tipo de archivos como zip, txt, xls, xlsx, doc, docx, jpg, png

pero cuando trato de encontrar la extensión del archivo de googlechrome, fallé.


2

Vale la pena mencionar cómo eliminar la extensión también en paralelo con la obtención de la extensión:

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

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

0

Esta solución también ayuda en casos de más de una extensión como "Avishay.student.DB"

                FileInfo FileInf = new FileInfo(filePath);
                string strExtention = FileInf.Name.Replace(System.IO.Path.GetFileNameWithoutExtension(FileInf.Name), "");
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.