Aby włożyć moje 5 centów:
TL, DR
Korzystam z MimetypesFileTypeMap i dodam każdy mime, którego nie ma, a szczególnie go potrzebuję, do pliku mime.types.
A teraz długo czytam:
Przede wszystkim lista typów MIME jest ogromna , patrz tutaj: https://www.iana.org/assignments/media-types/media-types.xhtml
Najpierw lubię korzystać ze standardowych udogodnień dostarczonych przez JDK, a jeśli to nie zadziała, pójdę poszukać czegoś innego.
Określ typ pliku na podstawie rozszerzenia pliku
Od wersji 1.6 Java ma MimetypesFileTypeMap, jak wskazano w jednej z powyższych odpowiedzi, i jest to najprostszy sposób na określenie typu MIME:
new MimetypesFileTypeMap().getContentType( fileName );
W swojej waniliowej implementacji nie robi to wiele (tj. Działa na .html, ale nie działa na .png). Jednak bardzo łatwo jest dodać dowolny typ zawartości, który może być potrzebny:
- Utwórz plik o nazwie „mime.types” w folderze META-INF w swoim projekcie
- Dodaj wiersz dla każdego potrzebnego typu MIME, a domyślna implementacja nie zapewnia (istnieją setki typów MIME i lista rośnie w miarę upływu czasu).
Przykładowe wpisy dla plików png i js to:
image/png png PNG
application/javascript js
Aby uzyskać informacje na temat formatu pliku mime.types, zobacz więcej szczegółów tutaj: https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html
Określ typ pliku na podstawie zawartości pliku
Od wersji 1.7 Java ma java.nio.file.spi.FileTypeDetector , który definiuje standardowy interfejs API do określania typu pliku w sposób specyficzny dla implementacji .
Aby pobrać typ MIME dla pliku, wystarczy użyć Pliki i zrobić to w kodzie:
Files.probeContentType(Paths.get("either file name or full path goes here"));
Definicja API zapewnia funkcje, które obsługują określanie typu MIME pliku na podstawie nazwy pliku lub zawartości pliku (bajty magiczne). Dlatego metoda probeContentType () zgłasza wyjątek IOException w przypadku, gdy implementacja tego interfejsu API używa podanej do niego ścieżki do faktycznego otwarcia pliku z nim powiązanego.
Ponownie, waniliowa implementacja tego (tego, który jest dostarczany z JDK) pozostawia wiele do życzenia.
W jakimś idealnym świecie w odległej galaktyce, wszystkie te biblioteki, które próbują rozwiązać ten problem typu „plik do mima”, po prostu zaimplementowałyby java.nio.file.spi.FileTypeDetector , upuściłbyś słoik preferowanej biblioteki implementującej plik do ścieżki klasy i to by było na tyle.
W prawdziwym świecie, w którym potrzebujesz sekcji TL, DR, powinieneś znaleźć bibliotekę z większością gwiazdek obok jej nazwy i użyć jej. W tym konkretnym przypadku nie potrzebuję (jeszcze;)).