2010-12-03 16 views
12

Estoy buscando una biblioteca de Java que le indique el tipo de mimo mirando el contenido del archivo (matriz de bytes). Encontré este proyecto utilizando jmimemagic y ya no es compatible con los tipos de archivos más nuevos (por ejemplo, el formato MS Word docx) ya que ahora está inactivo (a partir de 2006).biblioteca de Java para encontrar el tipo de mime desde el contenido del archivo

+3

http://sourceforge.net/projects/mime-util/files/mime-util/mime-util-2.1.3/ – khachik

+1

No creo que sea un duplicado de la pregunta a la que se hace referencia porque el autor pregunta explícitamente por detección por el contenido del archivo, mientras que las soluciones para la otra pregunta se refieren a un archivo (nombre de archivo incluido). – danielp

+0

¿Qué pasa con las soluciones [aquí] (http://www.rgagnon.com/javadetails/java-0487.html). ¿No funcionan para ti? – javamonkey79

Respuesta

5

Use Apache tika para la detección de contenido. Por favor encuentre el enlace a continuación. http://tika.apache.org/0.8/detection.html. Tenemos tantas dependencias tarro donde puede encontrar cuando se genera tika utilizando Maven

 ByteArrayInputStream bai = new ByteArrayInputStream(pByte); 
     ContentHandler contenthandler = new BodyContentHandler(); 
     Metadata metadata = new Metadata(); 
     Parser parser = new AutoDetectParser(); 
     try { 
       parser.parse(bai, contenthandler, metadata); 

     } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     } catch (SAXException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     } catch (TikaException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     }   
     System.out.println("Mime: " + metadata.get(Metadata.CONTENT_TYPE)); 
     return metadata.get(Metadata.CONTENT_TYPE); 
9

Tal vez útil para alguien, que necesita los formatos de oficina más utilizadas, así (y no utiliza Apache Tika):

public class MimeTypeUtils { 

    private static final Map<String, String> fileExtensionMap; 

    static { 
     fileExtensionMap = new HashMap<String, String>(); 
     // MS Office 
     fileExtensionMap.put("doc", "application/msword"); 
     fileExtensionMap.put("dot", "application/msword"); 
     fileExtensionMap.put("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
     fileExtensionMap.put("dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"); 
     fileExtensionMap.put("docm", "application/vnd.ms-word.document.macroEnabled.12"); 
     fileExtensionMap.put("dotm", "application/vnd.ms-word.template.macroEnabled.12"); 
     fileExtensionMap.put("xls", "application/vnd.ms-excel"); 
     fileExtensionMap.put("xlt", "application/vnd.ms-excel"); 
     fileExtensionMap.put("xla", "application/vnd.ms-excel"); 
     fileExtensionMap.put("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
     fileExtensionMap.put("xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"); 
     fileExtensionMap.put("xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12"); 
     fileExtensionMap.put("xltm", "application/vnd.ms-excel.template.macroEnabled.12"); 
     fileExtensionMap.put("xlam", "application/vnd.ms-excel.addin.macroEnabled.12"); 
     fileExtensionMap.put("xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12"); 
     fileExtensionMap.put("ppt", "application/vnd.ms-powerpoint"); 
     fileExtensionMap.put("pot", "application/vnd.ms-powerpoint"); 
     fileExtensionMap.put("pps", "application/vnd.ms-powerpoint"); 
     fileExtensionMap.put("ppa", "application/vnd.ms-powerpoint"); 
     fileExtensionMap.put("pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"); 
     fileExtensionMap.put("potx", "application/vnd.openxmlformats-officedocument.presentationml.template"); 
     fileExtensionMap.put("ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow"); 
     fileExtensionMap.put("ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12"); 
     fileExtensionMap.put("pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12"); 
     fileExtensionMap.put("potm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12"); 
     fileExtensionMap.put("ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12"); 
     // Open Office 
     fileExtensionMap.put("odt", "application/vnd.oasis.opendocument.text"); 
     fileExtensionMap.put("ott", "application/vnd.oasis.opendocument.text-template"); 
     fileExtensionMap.put("oth", "application/vnd.oasis.opendocument.text-web"); 
     fileExtensionMap.put("odm", "application/vnd.oasis.opendocument.text-master"); 
     fileExtensionMap.put("odg", "application/vnd.oasis.opendocument.graphics"); 
     fileExtensionMap.put("otg", "application/vnd.oasis.opendocument.graphics-template"); 
     fileExtensionMap.put("odp", "application/vnd.oasis.opendocument.presentation"); 
     fileExtensionMap.put("otp", "application/vnd.oasis.opendocument.presentation-template"); 
     fileExtensionMap.put("ods", "application/vnd.oasis.opendocument.spreadsheet"); 
     fileExtensionMap.put("ots", "application/vnd.oasis.opendocument.spreadsheet-template"); 
     fileExtensionMap.put("odc", "application/vnd.oasis.opendocument.chart"); 
     fileExtensionMap.put("odf", "application/vnd.oasis.opendocument.formula"); 
     fileExtensionMap.put("odb", "application/vnd.oasis.opendocument.database"); 
     fileExtensionMap.put("odi", "application/vnd.oasis.opendocument.image"); 
     fileExtensionMap.put("oxt", "application/vnd.openofficeorg.extension"); 
    } 

    public static String getContentTypeByFileName(String fileName) { 
     // 1. first use java's buildin utils 
     FileNameMap mimeTypes = URLConnection.getFileNameMap(); 
     String contentType = mimeTypes.getContentTypeFor(fileName); 
     // 2. nothing found -> lookup our in extension map to find types like ".doc" or ".docx" 
     if (!StringUtils.hasText(contentType)) { 
      String extension = FilenameUtils.getExtension(fileName); 
      contentType = fileExtensionMap.get(extension); 
     } 
     return contentType; 
    } 
} 
+0

No tiene idea de cuánto tiempo he estado buscando un ejemplo de esto. ¡Muchas gracias! – Mike

+0

¡Esto me ahorró una cantidad de tiempo desmesurada para actualizar una de mis aplicaciones y reconocer las nuevas extensiones de MS Office correctamente! ¡Gracias! – Saggio

+0

Tuve que cambiar 'if (! StringUtils.hasText (contentType)) {' a 'if (StringUtils.isBlank (contentType)) {'. Gracias por el codez! –

2

Yo uso javax.activation.MimetypesFileTypeMap. Comienza con un conjunto pequeño: $JRE_HOME/lib/content-types.properties, pero puede agregar el suyo. Cree un archivo mime.types en el formato que se muestra en el javadoc de MimetypesFileTypeMap (comencé con una gran lista de la red, lo masajeé y agregué tipos que no encontré). Ahora puede agregar eso en su código abriendo su archivo mime.types y agregando su contenido a su mapa. Sin embargo, la solución más fácil es agregar su archivo mime.types al META-INF de su jar. java.activation recogerá eso automáticamente.

Cuestiones relacionadas