type octet getcontenttype from example application java servlets inputstream mime-types

octet - get mime type from file java



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

Pregunta simple: ¿cómo puedo obtener el tipo MIME (o tipo de contenido) de un InputStream , sin guardar el archivo, para un archivo que un usuario está cargando a mi servlet?


Creo que esto resuelve el problema:

public String readIt(InputStream is) { if (is != null) { BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line).append("/n"); } is.close(); return sb.toString(); } return "error: "; }

¿Qué devuelve? Por ejemplo para png: "♦ PNG / n / n ♦♦♦ .....", para xml:

Muy útil, no puedes probar string.contains () para comprobar qué es


Depende de dónde está obteniendo el flujo de entrada. Si lo está obteniendo de un servlet, entonces es accesible 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 puede ser inyectada utilizando @Context. Si está cargando 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.


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

// 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 del archivo magicmimes.properties (no estoy seguro de que estas firmas sean correctas, pero funcionaron para mis usos)

# SignatureKey content/type /u0000/u201E/u00f1/u00d9 text/plain /u0025/u0050/u0044/u0046 application/pdf %PDF application/pdf /u0042/u004d image/bmp GIF8 image/gif /u0047/u0049/u0046/u0038 image/gif /u0049/u0049/u004D/u004D image/tiff /u0089/u0050/u004e/u0047 image/png /u00ff/u00d8/u00ff/u00e0 image/jpg




Si usa un servicio de descanso JAX-RS, puede obtenerlo desde MultipartBody.

@POST @Path( "/<service_path>" ) @Consumes( "multipart/form-data" ) public Response importShapeFile( final MultipartBody body ) { String filename = null; String InputStream stream = null; for ( Attachment attachment : body.getAllAttachments() ) { ContentDisposition disposition = attachment.getContentDisposition(); if ( disposition != null && PARAM_NAME.equals( disposition.getParameter( "name" ) ) ) { filename = disposition.getParameter( "filename" ); stream = attachment.getDataHandler().getInputStream(); break; } } // Read extension from filename to get the file''s type and // read the stream accordingly. }

Donde PARAM_NAME es una cadena que representa el nombre del parámetro que contiene la secuencia de archivos.


Simplemente puede agregar tika-app-1.x.jar a su ruta de clase, siempre y cuando no use el registro slf4j en otro lugar, ya que provocará una colisión. Si usas tika para detectar un flujo de entrada, tiene que ser marcado como compatible. De lo contrario, al llamar a tika se borrará tu flujo de entrada. Sin embargo, si utiliza la biblioteca apache IO para evitar esto y simplemente convierte el InputStream en un archivo en la memoria.

import org.apache.tika.*; Tike tika = new Tika(); InputStream in = null; FileOutputStream out = null; try{ out = new FileOutputStream(c:/tmp.tmp); IOUtils.copy(in, out); String mimeType = tika.detect(out); }catch(Exception e){ System.err.println(e); } finally { if(null != in) in.close(); if(null != out) out.close(); }