Saltar al contenido

¿Cómo puedo obtener el tipo MIME de un InputStream de un archivo que se está cargando?

Luego de observar en diferentes repositorios y foros al terminar hemos descubierto la resolución que te enseñaremos ahora.

Solución:

Escribí mi propio detector de tipo de contenido para un byte[] porque las bibliotecas anteriores no eran adecuadas o no tenía acceso a ellas. Esperemos que esto ayude a alguien.

// retrieve file as byte[]
byte[] b = odHit.retrieve( "" );

// copy top 32 bytes and pass to the guessMimeType(byte[]) funciton
byte[] topOfStream = new byte[32];
System.arraycopy(b, 0, topOfStream, 0, topOfStream.length);
String mimeGuess = guessMimeType(topOfStream);

private static String guessMimeType(byte[] topOfStream) 

    String mimeType = null;
    Properties magicmimes = new Properties();
    FileInputStream in = null;

    // Read in the magicmimes.properties file (e.g. of file listed below)
    try 
        in = new FileInputStream( "magicmimes.properties" );
        magicmimes.load(in);
        in.close();
     catch (FileNotFoundException e) 
        e.printStackTrace();
     catch (IOException e) 
        e.printStackTrace();
    

    // loop over each file signature, if a match is found, return mime type
    for ( Enumeration keys = magicmimes.keys(); keys.hasMoreElements(); ) 
        String key = (String) keys.nextElement();
        byte[] sample = new byte[key.length()];
        System.arraycopy(topOfStream, 0, sample, 0, sample.length);
        if( key.equals( new String(sample) ))
            mimeType = magicmimes.getProperty(key);
            System.out.println("Mime Found! "+ mimeType);
            break;
         else 
            System.out.println("trying "+key+" == "+new String(sample));
        
    

    return mimeType;

Ejemplo de archivo magicmimes.properties (no estoy seguro de que estas firmas sean correctas, pero funcionaron para mis usos)

# SignatureKey                  content/type
u0000u201Eu00f1u00d9        text/plain
u0025u0050u0044u0046        application/pdf
%PDF                            application/pdf
u0042u004d                    image/bmp
GIF8                            image/gif
u0047u0049u0046u0038        image/gif
u0049u0049u004Du004D        image/tiff
u0089u0050u004eu0047        image/png
u00ffu00d8u00ffu00e0        image/jpg

Según el excelente sitio de Real Gagnon, la mejor solución para su caso sería usar Apache Tika.

Depende de dónde obtenga el flujo de entrada. Si lo obtiene de un servlet, se puede acceder a él a través del objeto HttpServerRequest que es un argumento de doPost. Si está utilizando algún tipo de API de descanso como Jersey, la solicitud se puede inyectar utilizando @Context. Si carga el archivo a través de un socket, será su responsabilidad especificar el tipo MIME como parte de su protocolo, ya que no heredará los encabezados http.

valoraciones y reseñas

Recuerda que tienes autorización de decir .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *