Maison >développement back-end >C++ >Comment déterminer le type de mime d'un fichier en utilisant sa signature dans .NET?

Comment déterminer le type de mime d'un fichier en utilisant sa signature dans .NET?

DDD
DDDoriginal
2025-01-31 15:01:09669parcourir

How to Determine a File's MIME Type Using its Signature in .NET?

Déterminez le type de mime

.NET Framework a fourni une méthode de signature basée sur le fichier au lieu d'élargir le type de fichier de reconnaissance de nom. Ceci est particulièrement utile lors du traitement des fichiers incorrects ou manquants.

Pour déterminer le type MIME, vous pouvez utiliser la fonction

exportée

. Cette fonction reçoit le tampon d'octets de la signature du fichier et renvoie son type de mime. urlmon.dll FindMimeFromData Ce qui suit est un exemple de la façon d'utiliser cette fonction pour utiliser cette fonction:

Cette méthode fournit une méthode fiable qui ne peut obtenir son type MIME en fonction de la signature du fichier, quelle que soit l'extension. L'amélioration du code est qu'il est plus précis de gérer le nombre d'octets lus pour éviter le problème du réseau potentiel traversant la bordure.
<code class="language-csharp">using System.Runtime.InteropServices;
...

[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
private 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 dwReserverd
);

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

    byte[] buffer = new byte[256];
    using (FileStream fs = new FileStream(filename, FileMode.Open))
    {
        int bytesRead = fs.Read(buffer, 0, 256); // Read at most 256 bytes
        if (bytesRead < 256)
        {
            Array.Resize(ref buffer, bytesRead); // Resize buffer if less than 256 bytes were read
        }
    }
    try
    {
        uint mimetype;
        FindMimeFromData(0, null, buffer, (uint)buffer.Length, null, 0, out mimetype, 0);
        IntPtr mimeTypePtr = new IntPtr(mimetype);
        string mime = Marshal.PtrToStringUni(mimeTypePtr);
        Marshal.FreeCoTaskMem(mimeTypePtr);
        return mime;
    }
    catch (Exception e)
    {
        return "unknown/unknown";
    }
}</code>

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