Solución:
En Java 7 ahora puede usar Files.probeContentType(path)
.
Desafortunadamente,
mimeType = file.toURL().openConnection().getContentType();
no funciona, ya que este uso de URL deja un archivo bloqueado, por lo que, por ejemplo, no se puede eliminar.
Sin embargo, tienes esto:
mimeType= URLConnection.guessContentTypeFromName(file.getName());
y también lo siguiente, que tiene la ventaja de ir más allá del mero uso de la extensión de archivo y echar un vistazo al contenido
InputStream is = new BufferedInputStream(new FileInputStream(file));
mimeType = URLConnection.guessContentTypeFromStream(is);
//...close stream
Sin embargo, como sugiere el comentario anterior, la tabla incorporada de tipos de mime es bastante limitada y no incluye, por ejemplo, MSWord y PDF. Entonces, si desea generalizar, deberá ir más allá de las bibliotecas integradas, utilizando, por ejemplo, Mime-Util (que es una gran biblioteca, que usa tanto la extensión de archivo como el contenido).
Con Apache Tika solo necesitas tres líneas de código:
File file = new File("/path/to/file");
Tika tika = new Tika();
System.out.println(tika.detect(file));
Si tiene una consola maravillosa, simplemente pegue y ejecute este código para jugar con ella:
@Grab('org.apache.tika:tika-core:1.14')
import org.apache.tika.Tika;
def tika = new Tika()
def file = new File("/path/to/file")
println tika.detect(file)
Tenga en cuenta que sus API son ricas, puede analizar “cualquier cosa”. A partir de tika-core 1.14, tiene:
String detect(byte[] prefix)
String detect(byte[] prefix, String name)
String detect(File file)
String detect(InputStream stream)
String detect(InputStream stream, Metadata metadata)
String detect(InputStream stream, String name)
String detect(Path path)
String detect(String name)
String detect(URL url)
Consulte las apidocs para obtener más información.