Szukam prostego sposobu na uzyskanie typu MIME, w którym rozszerzenie pliku jest niepoprawne lub nie zostało podane, coś podobnego do tego pytania tylko w .Net.
c#
mime
mime-types
Richard Gourlay
źródło
źródło
Odpowiedzi:
W Urlmon.dll istnieje funkcja o nazwie
FindMimeFromData
.Z dokumentacji
Przeczytaj więc pierwsze (maksymalnie) 256 bajtów z pliku i przekaż je do
FindMimeFromData
.źródło
W końcu użyłem urlmon.dll. Myślałem, że będzie łatwiejszy sposób, ale to działa. Dołączam kod, aby pomóc komukolwiek innemu i pozwolić mi go znaleźć ponownie, jeśli będę go potrzebować.
...
źródło
Znalazłem zakodowane rozwiązanie, mam nadzieję, że pomogę komuś:
źródło
StringComparer.OrdinalIgnoreCase
konstruktora słownika. Porównywanie porządkowe jest szybsze niż niezmienne, a pozbędziesz się.ToLower()
jego odmian.Edycja: wystarczy użyć detektora Mime
Korzystam z sekwencji tablic bajtowych, aby określić poprawny typ MIME danego pliku. Zaletą tego jest tylko patrzenie na rozszerzenie nazwy pliku, ponieważ jeśli użytkownik miałby zmienić nazwę pliku, aby ominąć ograniczenia przesyłania określonego typu pliku, rozszerzenie nazwy pliku nie wychwyciłoby tego. Z drugiej strony, uzyskanie podpisu pliku za pomocą tablicy bajtów zatrzyma to złośliwe zachowanie.
Oto przykład w C #:
Zauważ, że traktowałem typy plików DOCX inaczej, ponieważ DOCX jest tak naprawdę tylko plikiem ZIP. W tym scenariuszu po prostu sprawdzam rozszerzenie pliku po sprawdzeniu, czy ma on tę sekwencję. Ten przykład jest daleki od ukończenia dla niektórych osób, ale możesz łatwo dodać własny.
Jeśli chcesz dodać więcej typy MIME, można uzyskać sekwencje tablicy bajtów wielu różnych typów plików stąd . Również tutaj jest kolejnym dobrym źródłem informacji dotyczącej podpisów plików.
To, co robię wiele razy, jeśli wszystko inne zawiedzie, to przejście przez kilka plików określonego typu, którego szukam, i poszukiwanie wzoru w sekwencji bajtów plików. Ostatecznie jest to nadal podstawowa weryfikacja i nie można jej użyć do 100% dowodu określenia typów plików.
źródło
Jeśli używasz .NET Framework 4.5 lub nowszego, istnieje teraz metoda MimeMapping.GetMimeMapping (nazwa pliku), która zwróci ciąg z poprawnym odwzorowaniem Mime dla przekazanej nazwy pliku. Pamiętaj, że używa to rozszerzenia pliku, a nie danych w samym pliku.
Dokumentacja znajduje się na stronie http://msdn.microsoft.com/en-us/library/system.web.mimemapping.getmimemapping
źródło
var mimetype = System.Web.MimeMapping.GetMimeMapping(<pathToFile>);
Możesz także zajrzeć do rejestru.
Tak czy inaczej będziesz musiał skorzystać z bazy danych MIME - niezależnie od tego, czy są one mapowane z rozszerzeń, czy z magicznych liczb, jest nieco banalne - jednym z takich miejsc jest rejestr systemu Windows. W przypadku rozwiązania niezależnego od platformy należałoby jednak wysłać tę bazę danych z kodem (lub jako samodzielną bibliotekę).
źródło
Używam rozwiązania hybrydowego:
źródło
.doc
jest plik.HeyRed.Mime.MimeGuesser.GuessMimeType
z Nuget byłby najlepszym rozwiązaniem, jeśli chcesz hostować swoje rozwiązanie ASP.NET w środowiskach innych niż Windows.Mapowanie rozszerzeń plików jest bardzo niepewne. Jeśli osoba atakująca prześle nieprawidłowe rozszerzenia, słownik mapowania umożliwi np. Dystrybucję plików wykonywalnych w plikach .jpg. Dlatego zawsze używaj biblioteki wąchania zawartości, aby poznać prawdziwy typ zawartości.
źródło
Myślę, że właściwa odpowiedź to połączenie odpowiedzi Steve'a Morgana i Serguei. Tak to robi Internet Explorer. Wywołanie pinvoke
FindMimeFromData
działa tylko dla 26 zakodowanych na stałe typów mimów. Ponadto da niejednoznaczne typy mimów (takie jaktext/plain
lubapplication/octet-stream
), nawet jeśli mogą istnieć bardziej specyficzne, bardziej odpowiednie typy mimów. Jeśli nie da dobrego typu mime, możesz przejść do rejestru w celu uzyskania bardziej konkretnego typu mime. Rejestr serwera może zawierać bardziej aktualne typy MIME.Zobacz: http://msdn.microsoft.com/en-us/library/ms775147(VS.85).aspx
źródło
Ta klasa używa poprzednich odpowiedzi, aby spróbować na 3 różne sposoby: kodowana na podstawie rozszerzenia, FindMimeFromData API i przy użyciu rejestru.
źródło
Uznałem to za przydatne. Dla programistów VB.NET:
źródło
Natknąłem się na ten sam problem i ostatecznie zdecydowałem się na własny smak rozwiązania Kirka Baucoma, które tu znalazłem .
Wydaje mi się, że jest to okazja dla kogoś do napisania usługi wyszukiwania online.
W każdym razie, mam nadzieję, że to pomoże.
źródło
Jeśli ktoś był na to gotowy, mógłby przenieść doskonały moduł perla File :: Type na .NET. W kodzie znajduje się zestaw wyszukiwania magicznych liczb w nagłówku pliku dla każdego typu pliku lub wyrażenia regularnego.
Oto biblioteka wykrywająca typy plików .NET http://filetypedetective.codeplex.com/, ale wykrywa tylko niewielką liczbę plików w tej chwili.
źródło
Ta odpowiedź jest kopią odpowiedzi autora (Richard Gourlay), ale została ulepszona w celu rozwiązania problemów z IIS 8 / win2012 (gdzie funkcja spowodowałaby awarię puli aplikacji), w oparciu o komentarz Rohlanda wskazujący na http://www.pinvoke.net /default.aspx/urlmon.findmimefromdata
...
źródło
@ Steve Morgan i @Richard Gourlay to świetne rozwiązanie, dziękuję za to. Jedną niewielką wadą jest to, że gdy liczba bajtów w pliku wynosi 255 lub mniej, typ mime czasami daje „application / octet-stream”, co jest nieco niedokładne dla plików, które powinny dawać „text / plain”. Zaktualizowałem twoją oryginalną metodę, aby uwzględnić tę sytuację w następujący sposób:
Jeśli liczba bajtów w pliku jest mniejsza lub równa 255, a wydedukowanym typem mime jest „application / octet-stream”, utwórz nową tablicę bajtów składającą się z bajtów oryginalnego pliku powtarzanych n-razy, aż do całkowitej liczby bajtów to> = 256. Następnie ponownie sprawdź typ MIME tej nowej tablicy bajtów.
Zmodyfikowana metoda:
źródło
IIS 7 lub więcej
Użyj tego kodu, ale musisz być administratorem na serwerze
źródło
Podczas pracy z rolą Windows Azure Web lub innym hostem, na którym działa Twoja aplikacja w ramach ograniczonego zaufania, nie zapomnij, że nie będziesz mieć dostępu do rejestru lub niezarządzanego kodu. Podejście hybrydowe - połączenie try-catch-for-register i słownika w pamięci wygląda na dobre rozwiązanie, które zawiera wszystkiego po trochu.
Używam tego kodu, aby to zrobić:
źródło
Skończyło się na użyciu Winista MimeDetector z Netomatix. Źródła można pobrać bezpłatnie po utworzeniu konta: http://www.netomatix.com/Products/DocumentManagement/MimeDetector.aspx
Jest to część innego pytania, na które odpowiedziano tutaj: alternatywa dla metody FindMimeFromData w Urlmon.dll, która ma więcej typów MIME. Moim zdaniem najlepsze rozwiązanie tego problemu.
źródło
Znalazłem kilka problemów z uruchomieniem tego kodu:
Jeśli spróbujesz uruchomić go z x64 / Win10, otrzymasz
Dzięki temu postowi PtrToStringUni nie działa w systemie Windows 10 i @xanatos
Zmodyfikowałem swoje rozwiązanie, aby działało pod x64 i .NET Core 2.1:
Dzięki
źródło
Witaj Dostosowałem projekt Winista.MimeDetect do rdzenia / struktury .net z awarią do pliku urlmon.dll. Za darmo: pakiet nuget .
źródło
mimeTypes.GetMimeTypeFromFile(bytes);
Napisałem walidator typu MIME. Prosimy, podziel się tym z tobą.
źródło