2012-11-30 10 views
26

Sto caricando i file su un bucket Amazon s3 e ho accesso a InputStream e una stringa contenente il Tipo MIME del file ma non il nome del file originale. Sta a me creare il nome e l'estensione del file prima di spingere il file fino a S3. Esiste una libreria o un modo conveniente per determinare l'estensione appropriata da utilizzare dal tipo MIME?Come determinare l'estensione del file appropriata da MIME Tipo in Java

Ho visto alcuni riferimenti alla libreria di Apache Tika ma sembra eccessivo e non sono riuscito a farlo per rilevare correttamente le estensioni dei file. Da quello che ho potuto raccogliere sembra che questo codice dovrebbe funzionare, ma sto solo diventando una stringa vuota quando il mio variabile di tipo è "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

Sei sicuro di aver bisogno di impostare un'estensione di file? Se conosci il tipo MIME, puoi caricarlo su S3 con l'appropriato 'Content-Type', e l'estensione (di solito) diventa irrilevante. – willglynn

+2

Sei corretto, ho appena controllato, e l'impostazione del Content-Type in ObjectMetadata per S3 fa il trucco nel mio caso. Mi piacerebbe ancora conoscere la risposta alla domanda, sembra che potrebbe tornare utile in futuro. – rphutchinson

+1

Abbastanza giusto. Non ci sono One True Mapping ™ di tipi MIME alle estensioni di file - alcuni tipi hanno più estensioni, alcune estensioni hanno più tipi - quindi quando sto usando un data store che può persistere in modo indipendente, cerco di memorizzare solo ciò che conosco e non cercare di indovinare. – willglynn

risposta

41

Come alcuni dei commentors hanno sottolineato fuori, non esiste una mappatura universale 1: 1 tra i mimetypes e le estensioni di file ... Alcuni tipi di mimo hanno più di una possibile estensione, molte estensioni sono condivise da più tipi di mimo, e alcuni dei mimi non hanno estensione.

Ove possibile, è molto meglio archiviare il mimetype e utilizzarlo andando avanti e dimenticando l'estensione.

Detto questo, se si desidera ottenere l'estensione di file più comune per un determinato mimetype, allora Tika è un buon modo per andare. Apache Tika ha un set molto grande di mimi che conosce, e per molti di questi conosce anche la magia del mimo per il rilevamento, estensioni comuni, descrizioni ecc.

Se si desidera ottenere l'estensione più comune per un file JPEG, quindi come mostrato nella this Apache Tika unit test avete solo bisogno di fare qualcosa di simile:

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

la cosa fondamentale è che è necessario caricare il file XML che impacchettato nel barattolo Tika per ottenere le definizioni di tutti i tipi MIME. Se si potrebbe avere a che fare con tipi MIME personalizzati troppo, quindi Tika sostiene coloro, e la linea di cambiamento di un essere:

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

Utilizzando il metodo TikaConfig per ottenere i MimeTypes, Tika sarà anche controllare il vostro percorso di classe per defintions mimetype personalizzato, e includi anche quelli.

Problemi correlati