Estoy buscando una manera simple de obtener un tipo mime donde la extensión del archivo es incorrecta o no se proporciona, algo similar a esta pregunta solo en .Net.
c#
mime
mime-types
Richard Gourlay
fuente
fuente
Respuestas:
En Urlmon.dll, hay una función llamada
FindMimeFromData
.De la documentación
Entonces, lea los primeros (hasta) 256 bytes del archivo y páselo
FindMimeFromData
.fuente
Utilicé urlmon.dll al final. Pensé que habría una manera más fácil, pero esto funciona. Incluyo el código para ayudar a cualquier otra persona y me permite encontrarlo nuevamente si lo necesito.
...
fuente
He encontrado una solución codificada, espero ayudar a alguien:
fuente
StringComparer.OrdinalIgnoreCase
el constructor del diccionario. La comparación ordinal es más rápida que la invariante, y eliminará.ToLower()
sus variaciones.Editar: solo use Mime Detective
Utilizo secuencias de conjuntos de bytes para determinar el tipo MIME correcto de un archivo determinado. La ventaja de esto sobre solo mirar la extensión de archivo del nombre de archivo es que si un usuario cambiara el nombre de un archivo para evitar ciertas restricciones de carga de tipo de archivo, la extensión de nombre de archivo no podría captar esto. Por otro lado, obtener la firma del archivo a través de una matriz de bytes detendrá este comportamiento travieso.
Aquí hay un ejemplo en C #:
Tenga en cuenta que manejé los tipos de archivos DOCX de manera diferente, ya que DOCX es realmente solo un archivo ZIP. En este escenario, simplemente verifico la extensión del archivo una vez que verifico que tiene esa secuencia. Este ejemplo está lejos de ser completo para algunas personas, pero puede agregar fácilmente el suyo.
Si desea agregar más tipos MIME, puede obtener las secuencias de matriz de bytes de muchos tipos de archivos diferentes desde aquí . Además, aquí hay otro buen recurso sobre firmas de archivos.
Lo que hago muchas veces si todo lo demás falla es recorrer varios archivos de un tipo particular que estoy buscando y buscar un patrón en la secuencia de bytes de los archivos. Al final, esto sigue siendo una verificación básica y no se puede usar para una prueba del 100% de determinar los tipos de archivo.
fuente
Si está utilizando .NET Framework 4.5 o superior, ahora hay un método MimeMapping.GetMimeMapping (nombre de archivo) que devolverá una cadena con la asignación Mime correcta para el nombre de archivo pasado. Tenga en cuenta que esto utiliza la extensión del archivo, no datos en el archivo en sí.
La documentación está en http://msdn.microsoft.com/en-us/library/system.web.mimemapping.getmimemapping
fuente
var mimetype = System.Web.MimeMapping.GetMimeMapping(<pathToFile>);
También puedes buscar en el registro.
De una forma u otra, tendrá que acceder a una base de datos de MIME, ya sea que estén mapeados desde extensiones o números mágicos, es algo trivial, el registro de Windows es uno de esos lugares. Para una solución independiente de la plataforma, sin embargo, uno tendría que enviar este DB con el código (o como una biblioteca independiente).
fuente
Yo uso una solución híbrida:
fuente
.doc
archivo.HeyRed.Mime.MimeGuesser.GuessMimeType
de Nuget sería la solución definitiva si desea alojar su solución ASP.NET en entornos que no sean Windows.La asignación de extensiones de archivo es muy insegura. Si un atacante cargara extensiones inválidas, un diccionario de mapeo permitiría, por ejemplo, distribuir ejecutables dentro de archivos .jpg. Por lo tanto, utilice siempre una biblioteca de análisis de contenido para conocer el tipo de contenido real.
fuente
Creo que la respuesta correcta es una combinación de las respuestas de Steve Morgan y Serguei. Así es como lo hace Internet Explorer. La llamada pinvoke a
FindMimeFromData
funciona solo para 26 tipos mime codificados. Además, dará tipos de mimos ambiguos (comotext/plain
oapplication/octet-stream
) aunque pueda existir un tipo de mimo más específico y más apropiado. Si no proporciona un buen tipo mime, puede ir al registro para obtener un tipo mime más específico. El registro del servidor podría tener tipos MIME más actualizados.Consulte: http://msdn.microsoft.com/en-us/library/ms775147(VS.85).aspx
fuente
Esta clase usa respuestas anteriores para probar de 3 maneras diferentes: codificado en función de la extensión, FindMimeFromData API y usando el registro.
fuente
Encontré este útil. Para desarrolladores de VB.NET:
fuente
Encontré el mismo problema y finalmente opté por mi propio sabor de la solución de Kirk Baucom, que se encuentra aquí .
Me parece que esta es una oportunidad para que alguien escriba un servicio de búsqueda en línea.
De todos modos, espero que ayude.
fuente
Si alguien lo deseara, podrían portar el excelente módulo perl File :: Type a .NET. En el código hay un conjunto de búsquedas de números mágicos de encabezado de archivo para cada tipo de archivo o coincidencias de expresiones regulares.
Aquí hay una biblioteca de detección de tipo de archivo .NET http://filetypedetective.codeplex.com/ pero en este momento solo detecta una pequeña cantidad de archivos.
fuente
Esta respuesta es una copia de la respuesta del autor (Richard Gourlay), pero se mejoró para resolver problemas en IIS 8 / win2012 (donde la función causaría un bloqueo del grupo de aplicaciones), según el comentario de Rohland que apunta a http://www.pinvoke.net /default.aspx/urlmon.findmimefromdata
...
fuente
@Steve Morgan y @Richard Gourlay esta es una gran solución, gracias por eso. Un pequeño inconveniente es que cuando el número de bytes en un archivo es 255 o inferior, el tipo mime a veces producirá "application / octet-stream", lo cual es un poco inexacto para los archivos que se espera que produzcan "text / plain". He actualizado su método original para dar cuenta de esta situación de la siguiente manera:
Si el número de bytes en el archivo es menor o igual a 255 y el tipo de mimo deducido es "application / octet-stream", cree una nueva matriz de bytes que consista en los bytes del archivo original repetidos n veces hasta el número total de bytes es> = 256. Luego, vuelva a verificar el tipo mime en esa nueva matriz de bytes.
Método modificado:
fuente
IIS 7 o más
Use este código, pero debe ser el administrador del servidor
fuente
Cuando trabaje con el rol web de Windows Azure o cualquier otro host que ejecute su aplicación en Confianza limitada, no olvide que no se le permitirá acceder al registro o al código no administrado. Enfoque híbrido: la combinación de try-catch-for-Registry y diccionario en memoria parece una buena solución que tiene un poco de todo.
Yo uso este código para hacerlo:
fuente
Terminé usando Winista MimeDetector de Netomatix. Las fuentes se pueden descargar de forma gratuita después de crear una cuenta: http://www.netomatix.com/Products/DocumentManagement/MimeDetector.aspx
Esto es parte de otra pregunta respondida aquí: alternativa al método FindMimeFromData en Urlmon.dll, que tiene más tipos MIME. La mejor solución para este problema en mi opinión.
fuente
Encontré varios problemas al ejecutar este código:
Si intenta ejecutarlo con x64 / Win10 obtendrá
Gracias a esta publicación, PtrToStringUni no funciona en Windows 10 y @xanatos
Modifiqué mi solución para ejecutar bajo x64 y .NET Core 2.1:
Gracias
fuente
Hola, he adaptado el proyecto Winista.MimeDetect en .net core / framework con respaldo en urlmon.dll . No dudes en usarlo: paquete nuget .
fuente
mimeTypes.GetMimeTypeFromFile(bytes);
Escribí un validador de tipo mime. Comparta amablemente con usted.
fuente