Eu só estava me perguntando como a maioria das pessoas busca um tipo MIME de um arquivo em Java? Até agora eu tentei dois utilitários: JMimeMagic
& Mime-Util
.
O primeiro me deu exceções de memória, o segundo não fecha seus fluxos corretamente. Eu só estava me perguntando se alguém mais tinha um método / biblioteca que eles usaram e funcionaram corretamente?
Respostas:
No Java 7, agora você pode apenas usar
Files.probeContentType(path)
.fonte
null
fora para.xml
,.png
e.xhtml
arquivos. Não sei se estou fazendo algo terrivelmente errado, mas isso parece terrível.Infelizmente,
não funciona, pois esse uso de URL deixa um arquivo bloqueado, de modo que, por exemplo, não pode ser excluído.
No entanto, você tem o seguinte:
e também o seguinte, que tem a vantagem de ir além do mero uso da extensão de arquivo e dar uma olhada no conteúdo
No entanto, conforme sugerido pelo comentário acima, a tabela interna de tipos MIME é bastante limitada, não incluindo, por exemplo, MSWord e PDF. Portanto, se você deseja generalizar, precisará ir além das bibliotecas internas, usando, por exemplo, o Mime-Util (que é uma ótima biblioteca, usando extensão de arquivo e conteúdo).
fonte
FileInputStream
emBufferedInputStream
é parte crucial - caso contrário,guessContentTypeFromStream
retornanull
(passouInputStream
instância deve apoiar marcas)URLConnection
possui um conjunto muito limitado de tipos de conteúdo que ele reconhece. Por exemplo, não é capaz de detectarapplication/pdf
.guessContentTypeFromName()
usa$JAVA_HOME/lib/content-types.properties
arquivo padrão . você pode adicionar seu próprio arquivo estendida alterando propriedade do sistemaSystem.setProperty("content.types.user.table","/lib/path/to/your/property/file");
A API do JAF faz parte do JDK 6. Veja o
javax.activation
pacote.As classes mais interessantes são
javax.activation.MimeType
- um detentor do tipo MIME real - ejavax.activation.MimetypesFileTypeMap
- cuja instância pode resolver o tipo MIME como String para um arquivo:fonte
getContentType(File)
estados: Retorna o tipo MIME do objeto de arquivo. A implementação nesta classe chamagetContentType(f.getName())
.MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(file)
Com o Apache Tika, você precisa de apenas três linhas de código :
Se você tem um console legal, basta colar e executar este código para brincar com ele:
Lembre-se de que suas APIs são ricas; ele pode analisar "qualquer coisa". No tika-core 1.14, você tem:
Veja os apidocs para mais informações.
fonte
new Tika().detect(file.toPath())
para a detecção do arquivo de extensão com base em vez de detecção com base no conteúdo do arquivonew Tika().detect(file.getPath())
, que só usa a extensão do arquivoO Apache Tika oferece no tika-core uma detecção do tipo MIME com base em marcadores mágicos no prefixo do fluxo.
tika-core
não busca outras dependências, o que a torna tão leve quanto o Mime Type Detection Utility atualmente não mantido .Exemplo de código simples (Java 7), usando as variáveis
theInputStream
etheFileName
Observe que o MediaType.detect (...) não pode ser usado diretamente ( TIKA-1120 ). Mais dicas são fornecidas em https://tika.apache.org/0.10/detection.html .
fonte
Metadata.RESOURCE_NAME_KEY
pode ser omitido (se você não possui ou não pode confiar no nome original), mas nesse caso você obtém resultado errado em alguns casos (documentos do escritório, por exemplo).Se você é um desenvolvedor Android, pode usar uma classe de utilitário
android.webkit.MimeTypeMap
que mapeia os tipos MIME para extensões de arquivo e vice-versa.O seguinte snippet de código pode ajudá-lo.
fonte
De roseindia :
fonte
Se você estiver com o java 5-6, então esta classe de utilitário do produto de código-fonte aberto servoy .
Você só precisa desta função
Ele investiga os primeiros bytes do conteúdo e retorna os tipos de conteúdo com base nesse conteúdo e não por extensão de arquivo.
fonte
Publiquei meu pacote Java SimpleMagic , que permite a determinação do tipo de conteúdo (mime-type) a partir de arquivos e matrizes de bytes. Ele foi projetado para ler e executar os arquivos mágicos de comando do arquivo Unix (1) que fazem parte da maioria das configurações do ~ Unix OS.
Eu tentei o Apache Tika, mas é enorme, com toneladas de dependências,
URLConnection
não usa os bytes dos arquivos eMimetypesFileTypeMap
também apenas olha os nomes dos arquivos.Com o SimpleMagic, você pode fazer algo como:
fonte
Para checar meus 5 centavos:
TL, DR
Uso MimetypesFileTypeMap e adiciono qualquer mímica que não esteja lá e preciso especificamente dela, no arquivo mime.types.
E agora, a longa leitura:
Primeiro, a lista de tipos MIME é enorme , veja aqui: https://www.iana.org/assignments/media-types/media-types.xhtml
Gosto de usar as instalações padrão fornecidas pelo JDK primeiro e, se isso não funcionar, irei procurar outra coisa.
Determinar o tipo de arquivo da extensão do arquivo
Desde a versão 1.6, o Java possui MimetypesFileTypeMap, conforme apontado em uma das respostas acima, e é a maneira mais simples de determinar o tipo mime:
Na sua implementação de baunilha, isso não faz muito (ou seja, funciona para .html, mas não para .png). No entanto, é super simples adicionar qualquer tipo de conteúdo que você possa precisar:
As entradas de exemplo para arquivos png e js seriam:
Para o formato de arquivo mime.types, veja mais detalhes aqui: https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html
Determinar o tipo de arquivo a partir do conteúdo do arquivo
Desde 1.7, Java possui java.nio.file.spi.FileTypeDetector , que define uma API padrão para determinar um tipo de arquivo de maneira específica de implementação .
Para buscar o tipo MIME para um arquivo, basta usar Arquivos e fazer isso no seu código:
A definição da API fornece recursos que suportam a determinação do tipo de mímica de arquivo a partir do nome do arquivo ou do conteúdo do arquivo (bytes mágicos). É por isso que o método probeContentType () lança IOException, caso uma implementação dessa API use o Path fornecido para tentar realmente abrir o arquivo associado a ela.
Novamente, a implementação baunilha disso (a que acompanha o JDK) deixa muito a desejar.
Em algum mundo ideal em uma galáxia muito distante, todas essas bibliotecas que tentam resolver esse problema de arquivo a mimo simplesmente implementariam java.nio.file.spi.FileTypeDetector , você deixaria o jar da biblioteca de implementação preferida arquivo em seu caminho de classe e seria isso.
No mundo real, aquele em que você precisa da seção TL, DR, você deve encontrar a biblioteca com mais estrelas ao lado do nome e usá-la. Para este caso em particular, não preciso de um (ainda;)).
fonte
Eu tentei várias maneiras de fazer isso, incluindo as primeiras ditas por Joshua Fox. Mas alguns não reconhecem tipos de mimet frequentes, como arquivos PDF, e outros não podem ser confiáveis com arquivos falsos (tentei com um arquivo RAR com a extensão alterada para TIF). A solução que encontrei, como também é dito por Joshua Fox de uma maneira superficial, é usar o MimeUtil2 , assim:
fonte
É melhor usar a validação em duas camadas para o upload de arquivos.
Primeiro você pode verificar o mimeType e validá-lo.
Segundo, você deve converter os 4 primeiros bytes do seu arquivo em hexadecimal e depois compará-lo com os números mágicos. Então será uma maneira realmente segura de verificar as validações de arquivo.
fonte
Esta é a maneira mais simples que encontrei para fazer isso:
fonte
Se você estiver trabalhando com um Servlet e se o contexto do servlet estiver disponível, você poderá usar:
fonte
getServletContext
?no arquivo MultipartFile da primavera ;
file.getContentType();
fonte
Se você trabalha no sistema operacional Linux, há uma linha de comando
file --mimetype
:Então
fonte
Depois de tentar várias outras bibliotecas, resolvi usar o mime-util.
fonte
fonte
Você pode fazer isso com apenas uma linha: MimetypesFileTypeMap (). GetContentType (new File ("filename.ext")) . Veja o código de teste completo (Java 7):
Este código produz a seguinte saída: text / plain
fonte
fonte
Eu fiz isso com o seguinte código.
fonte
Apache Tika.
e duas linhas de código.
Captura de tela abaixo
fonte