500 Stimmen

MIME-Typ aus Dateinamenerweiterung ermitteln

Wie kann ich den MIME-Typ aus einer Dateierweiterung ermitteln?

1voto

user413990 Punkte 29

Wäre besser, wenn jemand ähnliche Funktionen wie in libmagic auf Linux verwenden kann, da dies meiner Meinung nach ein besserer Weg ist, um Dateitypen zu erkennen, als sich auf den Erweiterungsnamen einer Datei zu verlassen.

Wenn ich zum Beispiel eine Datei von mypicture.jpg in mypicture.txt umbenenne Unter Linux wird sie immer noch als Bild gemeldet. Aber mit dieser Methode hier wird sie als Textdatei gemeldet.

Viele Grüße Tomas

0voto

Rusty Nail Punkte 2685

IANA-Medientypen

Ich wünschte, Microsoft würde seinen Industriestandard in den Griff bekommen! Für andere, alle Interessierten:

Diskrete Typen

Mehrteilige Typen

Ich möchte Ihnen die Lektüre des: MIME-Typen (IANA-Medientypen) Mozilla-Seite für alle Interessierten! Sie ist sehr informativ!

Unter jedem der oben genannten Links können Sie eine .csv-Datei herunterladen: https://www.iana.org/assignments/media-types/application.csv

Wie hier bereits erwähnt, könnte ein Dictionary oder ein ConcurrentDictionary eine Idee für den Download und das Auffüllen des Dictionarys mit Schlüssel-Wert-Paaren sein.

0voto

Samuel Joy Punkte 538

Es ist nicht immer notwendig, dass der durch die Dateierweiterung berechnete Mime-Type immer richtig ist.

Sagen wir, ich kann eine Datei mit der Erweiterung .png speichern, aber das Dateiformat kann ich als "ImageFormat.jpeg" festlegen.

In diesem Fall wird die Datei, die Sie berechnen, ein anderes Ergebnis liefern... es kann zu einer größeren Datei als dem Original führen.

Wenn Sie mit Bildern arbeiten, können Sie imagecodecInfo und ImageFormat verwenden.

0voto

Carsten Punkte 10787

Wenn Sie keine zusätzlichen Abhängigkeiten hinzufügen möchten und trotzdem versionsunabhängige Anfragen wünschen, können Sie die diese Antwort, wie man den MIME-Type in verschiedenen .NET-Versionen erhält con diese Antwort zu bedingten Builds für mehrere .NET Framework-Versionen .

Als erstes habe ich meine Projektdatei bearbeitet. Nach der letzten Build-Definition habe ich die Eigenschaftsgruppe wie in der zweiten Antwort angegeben hinzugefügt:

<PropertyGroup>
    <DefineConstants Condition=" !$(DefineConstants.Contains(';NET')) ">$(DefineConstants);$(TargetFrameworkVersion.Replace("v", "NET").Replace(".", ""))</DefineConstants>
    <DefineConstants Condition=" $(DefineConstants.Contains(';NET')) ">$(DefineConstants.Remove($(DefineConstants.LastIndexOf(";NET"))));$(TargetFrameworkVersion.Replace("v", "NET").Replace(".", ""))</DefineConstants>
</PropertyGroup>

Jetzt habe ich verschiedene Implementierungen für die MimeExtensionHelper aus der ersten Antwort, mit einer zusätzlichen für alle Clients von .NET 4.5 oder später, die einfach System.Web.MimeMapping.GetMimeMapping :

#if (NET10 || NET11 || NET20 || NET30 || NET35)
public static class MimeExtensionHelper
{
    static object locker = new object();
    static MethodInfo getMimeMappingMethodInfo;

    static MimeExtensionHelper()
    {
        Type mimeMappingType = Assembly.GetAssembly(typeof(HttpRuntime)).GetType("System.Web.MimeMapping");

        if (mimeMappingType == null)
            throw new SystemException("Couldnt find MimeMapping type");

        ConstructorInfo constructorInfo = mimeMappingType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);

        if (constructorInfo == null)
            throw new SystemException("Couldnt find default constructor for MimeMapping");

        mimeMapping = constructorInfo.Invoke(null);

        if (mimeMapping == null)
            throw new SystemException("Couldnt find MimeMapping");

        getMimeMappingMethodInfo = mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic);

        if (getMimeMappingMethodInfo == null)
            throw new SystemException("Couldnt find GetMimeMapping method");

        if (getMimeMappingMethodInfo.ReturnType != typeof(string))
            throw new SystemException("GetMimeMapping method has invalid return type");

        if (getMimeMappingMethodInfo.GetParameters().Length != 1 && getMimeMappingMethodInfo.GetParameters()[0].ParameterType != typeof(string))
            throw new SystemException("GetMimeMapping method has invalid parameters");
    }

    public static string GetMimeType(string fileName)
    {
        lock (locker)
        {
            return (string)getMimeMappingMethodInfo.Invoke(null, new object[] { fileName });
        }
    }
}
#elif NET40
public static class MimeExtensionHelper
{
    static object locker = new object();
    static MethodInfo getMimeMappingMethodInfo;

    static MimeExtensionHelper()
    {
        Type mimeMappingType = Assembly.GetAssembly(typeof(HttpRuntime)).GetType("System.Web.MimeMapping");

        if (mimeMappingType == null)
            throw new SystemException("Couldnt find MimeMapping type");           

        getMimeMappingMethodInfo = mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);

        if (getMimeMappingMethodInfo == null)
            throw new SystemException("Couldnt find GetMimeMapping method");

        if (getMimeMappingMethodInfo.ReturnType != typeof(string))
            throw new SystemException("GetMimeMapping method has invalid return type");

        if (getMimeMappingMethodInfo.GetParameters().Length != 1 && getMimeMappingMethodInfo.GetParameters()[0].ParameterType != typeof(string))
            throw new SystemException("GetMimeMapping method has invalid parameters");
    }

    public static string GetMimeType(string fileName)
    {
        lock (locker)
        {
            return (string)getMimeMappingMethodInfo.Invoke(null, new object[] { fileName });
        }
    }
}
#else // .NET 4.5 or later
public static class MimeExtensionHelper
{
    public static string GetMimeType(string fileName)
    {
        return MimeMapping.GetMimeMapping(fileName);
    }
}
#endif

Auch in den Versionen vor .NET 4.5 war die statische MimeMapping Klasse beherbergt eine statische Instanz namens _mappingDictionary (vom Typ MimeMapping.MimeMappingDictionaryBase ), die Sie von Reflection anfordern können, um neue MIME-Typen hinzuzufügen, die möglicherweise noch nicht unterstützt werden.

0voto

Jaisimha Punkte 1

Der obige Beitrag von Bryan Denny funktioniert bei mir nicht, da nicht alle Erweiterungen einen Unterschlüssel "Content Type" in der Registrierung haben. Ich musste den Code wie folgt abändern:

private string GetMimeType(string sFileName)
{
  // Get file extension and if it is empty, return unknown
  string sExt = Path.GetExtension(sFileName);
  if (string.IsNullOrEmpty(sExt)) return "Unknown file type";

  // Default type is "EXT File"
  string mimeType = string.Format("{0} File", sExt.ToUpper().Replace(".", ""));

  // Open the registry key for the extension under HKEY_CLASSES_ROOT and return default if it doesn't exist
  Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(sExt);
  if (regKey == null) return mimeType;

  // Get the "(Default)" value and re-open the key for that value
  string sSubType = regKey.GetValue("").ToString();
  regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(sSubType);

  // If it exists, get the "(Default)" value of the new key
  if (regKey?.GetValue("") != null) mimeType = regKey.GetValue("").ToString();

  // Return the value
  return mimeType;
}

Jetzt funktioniert es bei mir für alle registrierten Dateitypen und nicht registrierte oder allgemeine Dateitypen (wie JPG usw.) problemlos.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X