W C#, Jak mogę poznać typ pliku z bajtu []?

Mam wypełnioną tablicę bajtów z przesłanego pliku. Ale w innej części kodu, muszę znać ten typ pliku przesłany z bajtu [], aby móc renderować poprawny typ zawartości do przeglądarki!

Dzięki!!

Author: AndreMiranda, 2009-10-31

10 answers

Nie jestem pewien, ale może powinieneś zbadać magiczne liczby .

Update: Czytając o tym, nie sądzę, że jest to bardzo wiarygodne.

 8
Author: Carles Company,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-31 18:48:35

Jak wspomniano, Magia MIMU jest jedynym sposobem, aby to zrobić. Wiele platform zapewnia aktualne i solidne pliki MIME magic i kod, aby to zrobić efektywnie. Jedynym sposobem, aby to zrobić w. Net bez żadnego kodu stron trzecich, jest użycie {[1] } z urlmon.dll. Oto jak:

public static int MimeSampleSize = 256;

public static string DefaultMimeType = "application/octet-stream";

[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
private extern static 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 GetMimeFromBytes(byte[] data) {
    try {
        uint mimeType;
        FindMimeFromData(0, null, data, (uint)MimeSampleSize, null, 0, out mimeType, 0);

        var mimePointer = new IntPtr(mimeType);
        var mime = Marshal.PtrToStringUni(mimePointer);
        Marshal.FreeCoTaskMem(mimePointer);

        return mime ?? DefaultMimeType;
    }
    catch {
        return DefaultMimeType;
    }
}

Używa detektora MIME Internet Explorer. Jest to ten sam kod używany przez IE do wysyłania typu MIME wraz z przesłanymi plikami. Możesz zobaczyć listę typów MIME obsługiwanych przez urlmon.dll . Jedna rzecz, na którą należy uważać for is image/pjpeg i image/x-png, które są niestandardowe. W moim kodzie zamieniam je na image/jpeg i image/png.

 19
Author: mroach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-31 12:42:08

Nie możesz go znać ze strumienia bajtów, ale możesz zapisać typ MIME, gdy początkowo wypełnisz byte[].

 8
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-31 16:28:53

Krótka odpowiedź: nie możesz

Longer odpowiedź: zazwyczaj programy używają rozszerzenia pliku, aby wiedzieć, z jakim typem pliku mają do czynienia. Jeśli nie masz tego rozszerzenia, możesz tylko zgadywać... na przykład, możesz spojrzeć na kilka pierwszych bajtów i sprawdzić, Czy rozpoznajesz znany nagłówek (np. znacznik deklaracji XML, albo nagłówek bitmapy lub JPEG). Ale to zawsze będzie domysłem w końcu : bez metadanych lub informacji o treści tablica bajtów jest po prostu bez znaczenia...

 7
Author: Thomas Levesque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-09 07:57:22

If you know it ' s a System.Drawing.Image, można zrobić:

public static string GeMimeTypeFromImageByteArray(byte[] byteArray)
{
   using (MemoryStream stream = new MemoryStream(byteArray))
   using (Image image = Image.FromStream(stream))
   {
       return ImageCodecInfo.GetImageEncoders().First(codec => codec.FormatID == image.RawFormat.Guid).MimeType;
   }
}
 3
Author: yazanpro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-08 19:23:03

Przypomina mi to, że kiedyś" niektórzy ludzie " dzielili się plikami rar 50MB na wczesnych darmowych witrynach hostingowych obrazów, po prostu dodając .rozszerzenie gif do .nazwa pliku rar.

Oczywiście, jeśli jesteś osobą publiczną i oczekujesz określonego typu pliku i musisz być pewien, że jest to ten typ pliku, to nie możesz po prostu zaufać rozszerzeniu.

Z drugiej strony, jeśli Twoja aplikacja nie miałaby powodu do nieufności do przesłanego rozszerzenia i typu MIME, to po prostu uzyskaj je, gdy plik zostanie przesłany, jak odpowiedzi otrzymane od @rossfabircant i @RandolphPotter. Utwórz typ, który ma bajt [], jak również oryginalny rozszerzenie lub typ MIME i przekaż go.

Jeśli chcesz zweryfikować, czy plik jest rzeczywiście pewnym oczekiwanym typem, takim jak valid .jpeg, lub .png możesz spróbować zinterpretować plik jako te typy i sprawdzić, czy otworzy się pomyślnie. (System.Rysunek.Obrazowanie.ImageFormat)

Jeśli próbujesz sklasyfikować tylko plik z zawartości binarnej, a może to być dowolny format na całym świecie, jest to naprawdę trudny, otwarty problem i nie ma 100% niezawodnego sposobu, aby to zrobić. Możesz powołać się TrID przeciwko niemu, a prawdopodobnie istnieją podobne narzędzia śledcze używane przez śledczych organów ścigania, jeśli możesz je znaleźć (i sobie na nie pozwolić).

Jeśli nie musisz tego robić w trudny sposób, nie rób tego.

 2
Author: DanO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-04 16:37:55

Nie chcesz tego zrobić w ten sposób. Ścieżka Połączenia.GetExtension po przesłaniu pliku i przekazać rozszerzenie za pomocą bajtu [].

 1
Author: RossFabricant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-31 16:32:49

Jeśli masz ograniczoną liczbę oczekiwanych typów plików, które chcesz obsługiwać, magiczne liczby mogą być rozwiązaniem.

Prostym sposobem sprawdzenia jest otwarcie przykładowych plików za pomocą edytora tekstu / szesnastkowego i zbadanie wiodących bajtów, aby sprawdzić, czy jest tam coś, czego możesz użyć do odróżnienia/odrzucenia plików od obsługiwanego zestawu.

Jeśli, z drugiej strony, chcesz rozpoznać dowolny typ pliku, tak, jak wszyscy już stwierdzili, trudno.

 0
Author: Oskuro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-20 14:51:39

Korzystanie z systemu.Rysunek.Image " RawFormat.GUID ' właściwość można wykryć typ MIME obrazów.

Ale nie jestem pewien, jak znaleźć inne typy plików.

Http://www.java2s.com/Code/CSharp/Network/GetImageMimeType.htm

UPDATE: możesz spróbować spojrzeć na ten post

Używając. NET, jak można znaleźć typ MIME pliku na podstawie sygnatury pliku, a nie rozszerzenia

 0
Author: Muhammad Omar ElShourbagy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:23

Jeśli znasz rozszerzenie nazwy pliku, może to być System.Www.MimeMapping da radę:

MimeMapping.GetMimeMapping(fileDisplayNameWithExtension)

Użyłem go w takiej akcji MVC:

return File(fileDataByteArray, MimeMapping.GetMimeMapping(fileDisplayNameWithExtension), fileDisplayNameWithExtension);
 0
Author: Yasser Sobhdel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-08 15:18:42