2012-11-30 13 views
26

Przesyłam pliki do zasobnika Amazon s3 i mam dostęp do InputStream oraz ciąg zawierający typ MIME pliku, ale nie oryginalną nazwę pliku. To zależy od mnie, czy faktycznie utworzę nazwę pliku i rozszerzenie przed wysłaniem pliku do S3. Czy istnieje biblioteka lub wygodny sposób określenia odpowiedniego rozszerzenia do użycia z typu MIME?Jak określić odpowiednie rozszerzenie pliku z typu MIME w Javie

Widziałem kilka odwołań do biblioteki Apache Tika, ale to wygląda na przesadę i nie udało mi się jej skutecznie wykryć rozszerzeń plików. Z tego co udało mi się zebrać wydaje się, że ten kod powinien działać, ale jestem po prostu coraz pusty ciąg, kiedy mój typ zmiennej jest „image/jpeg”

MimeType mimeType = null; 
    try { 
     mimeType = new MimeTypes().forName(type); 
    } catch (MimeTypeException e) { 
     Logger.error("Couldn't Detect Mime Type for type: " + type, e); 
    } 

    if (mimeType != null) { 
     String extension = mimeType.getExtension(); 
     //do something with the extension 
    } 
+1

Czy na pewno chcesz ustawić rozszerzenie pliku? Jeśli znasz typ MIME, możesz przesłać go do S3 z właściwym 'Content-Type', a rozszerzenie (zwykle) staje się nieistotne. – willglynn

+2

Masz rację, właśnie sprawdziłem i ustawienie Content-Type w ObjectMetadata dla S3 działa w moim przypadku. Nadal chciałbym znać odpowiedź na to pytanie, wydaje się, że może się przydać w przyszłości. – rphutchinson

+1

Wystarczająco fair. Brak typów One Mapping ™ z typami MIME do rozszerzeń plików - niektóre typy mają wiele rozszerzeń, niektóre rozszerzenia mają wiele typów - więc gdy używam magazynu danych, który może działać niezależnie, staram się przechowywać tylko to, co wiem i powstrzymać się od zgadywania. – willglynn

Odpowiedz

41

Ponieważ niektóre z commentors wskazywali obecnie nie ma uniwersalnego odwzorowania 1: 1 między typami MIME a rozszerzeniami plików ... Niektóre typy MIME mają więcej niż jedno możliwe rozszerzenie, wiele rozszerzeń jest współużytkowanych przez wiele typów MIME, a niektóre typy MIME nie mają rozszerzenia.

W miarę możliwości lepiej jest przechowywać typ MIME i używać go w przyszłości, zapominając o rozszerzeniu.

To powiedziawszy, jeśli chcesz uzyskać najczęstsze rozszerzenie pliku dla danego typu MIME, to Tika jest dobrym sposobem. Apache Tika ma bardzo duży zestaw typów MIME, o których wie, i dla wielu z nich zna magię mime do wykrywania, typowych rozszerzeń, opisów itp.

Jeśli chcesz uzyskać najbardziej popularne rozszerzenie pliku JPEG, to jak pokazano na this Apache Tika unit test po prostu trzeba zrobić coś takiego:

MimeTypes allTypes = MimeTypes.getDefaultMimeTypes(); 
    MimeType jpeg = allTypes.forName("image/jpeg"); 
    String jpegExt = jpeg.getExtension(); // .jpg 
    assertEquals(".jpg", jpeg.getExtension()); 

Kluczową rzeczą jest to, że trzeba załadować plik xml, który jest spakowane w słoiku Tika aby definicje wszystkich typów MIME. Jeśli można mieć do czynienia z niestandardowych typów MIME też wtedy Tika wspiera tych, i zmiana linii jeden za:

TikaConfig config = TikaConfig.getDefaultConfig(); 
    MimeTypes allTypes = config.getMimeRepository(); 

Stosując metodę TikaConfig uzyskać MIMETYPES, Tika będzie również sprawdzić ścieżkę klasy dla defintions zwyczaj mimeType, i włącz ich również.

Powiązane problemy