¿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?
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 =newMemoryStream()){
postedFile.InputStream.CopyTo(target);vararray= 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 .
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.
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
Puede verificar la firma .flv. Puede descargar la especificación aquí:
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' arraystring[] 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);}
Respuestas:
Path.GetExtension
fuente
Simplemente puede leer la secuencia de un archivo
Los primeros índices de 5/6 le indicarán el tipo de archivo. En caso de FLV es 70, 76, 86, 1, 5 .
si
isAllowed
es igual quetrue
su FLV.O
Leer el contenido de un archivo
Las primeras dos / tres letras le indicarán el tipo de archivo.
En caso de FLV su "FLV ......"
fuente
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
Si estaba usando FileUpload en C #, por ejemplo, podría hacer
fuente
No estoy seguro de si esto es lo que quieres pero:
O:
fuente
Además, si tiene un
FileInfo fi
, simplemente puede hacer:y mantendrá la extensión del archivo (nota: incluirá el
.
, por lo que un resultado de lo anterior podría ser:,.jpg
.txt
y así sucesivamente ...fuente
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.
fuente
Puede verificar la firma .flv. Puede descargar la especificación aquí:
http://www.adobe.com/devnet/flv/
Consulte el capítulo "El encabezado FLV".
fuente
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
fuente
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é.
fuente
Vale la pena mencionar cómo eliminar la extensión también en paralelo con la obtención de la extensión:
fuente
Esta solución también ayuda en casos de más de una extensión como "Avishay.student.DB"
fuente