Maison >développement back-end >C++ >Comment puis-je déterminer de manière fiable le type de mime d'un fichier dans .NET, même sans extension valide?

Comment puis-je déterminer de manière fiable le type de mime d'un fichier dans .NET, même sans extension valide?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-31 14:51:12518parcourir

How Can I Reliably Determine a File's MIME Type in .NET, Even Without a Valid Extension?

Déterminer le type de mime d'un fichier dans .NET: contourner les problèmes d'extension

Un défi commun dans le développement .NET consiste à identifier avec précision le type de mime d'un fichier, en particulier lorsqu'il s'agit de fichiers manquant d'extensions appropriées ou d'avoir des extensions incorrectes. Cela se produit souvent avec des systèmes hérités ou des flux de données bruts.

Cet article présente une solution robuste en utilisant la méthode FindMimeFromData de urlmon.dll. Cette méthode analyse la signature du fichier (les 256 premiers octets) pour déterminer son type de mime, fournissant un résultat fiable même sans extension valide.

Étapes d'implémentation:

  1. Importer urlmon.dll: Utiliser System.Runtime.InteropServices pour importer la dll nécessaire.
  2. Déclare FindMimeFromData: Définissez la fonction externe FindMimeFromData.
  3. Lire la signature du fichier: Créez une fonction pour lire les 256 octets initiaux du fichier dans un tableau d'octets. Gérer les fichiers inférieurs à 256 octets gracieusement.
  4. Appelez FindMimeFromData: Invoquez la méthode, passant le tableau d'octets. Une proposition de type MIME null MIME garantit que la méthode repose uniquement sur la signature du fichier.

Exemple de code:

<code class="language-csharp">using System.Runtime.InteropServices;
using System.IO;

[DllImport("urlmon.dll", CharSet = CharSet.Auto)]
static extern uint FindMimeFromData(uint pBC, [MarshalAs(UnmanagedType.LPStr)] string pwzUrl, [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer, uint cbSize, [MarshalAs(UnmanagedType.LPStr)] string pwzMimeProposed, uint dwMimeFlags, out uint ppwzMimeOut, uint dwReserved);

public static string GetMimeType(string filePath)
{
    if (!File.Exists(filePath))
        throw new FileNotFoundException($"File not found: {filePath}");

    byte[] buffer = new byte[256];
    using (FileStream fs = new FileStream(filePath, FileMode.Open))
    {
        int bytesRead = fs.Read(buffer, 0, Math.Min(256, (int)fs.Length)); //Handle files < 256 bytes
    }

    uint mimeTypePtr;
    FindMimeFromData(0, null, buffer, (uint)buffer.Length, null, 0, out mimeTypePtr, 0);
    IntPtr ptr = new IntPtr(mimeTypePtr);
    string mimeType = Marshal.PtrToStringUni(ptr);
    Marshal.FreeCoTaskMem(ptr);
    return mimeType ?? "unknown/unknown"; //Handle potential null return
}</code>

Cet extrait de code amélioré gère efficacement les fichiers de n'importe quelle taille et fournit un type de mime "inconnu / inconnu" par défaut si la détection échoue. Cette approche garantit une identification fiable de type mime, quelle que soit la validité d'extension du fichier.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn