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!!
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.
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
.
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[]
.
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...
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;
}
}
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.
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 [].
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.
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
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);
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