Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ola pessoal!
To com uma duvida cruel! :D
Como identificar o tipo mime do arquivo?
Ja tentei:
Alguma luz?
Use a função finfo_file.
>
Use a função finfo_file.
Opa @Leozitho,
No meu caso nao da pois a extensao nao e nativa e eu preciso manter compatibilidade com PHP 5.1 em diante e lib so esta disponivel apos PHP 5.3.
Mesmo assim, vlw a forca.
Experimente getimagesize() :seta: http://php.net/manual/en/function.getimagesize.php
Dá para descobrir também através da shell, se você tiver acesso à ela.
Um abraço!
Para manter a compatibilidade você pode criar uma função e dentro dela uma condição para verificar a versão do PHP, se for menor que a versão 5.3.0 você usa a função mime_content_type, se for igual ou maior você usa a finfo_file. Para fazer a comparação com a versão do PHP você pode usar a função version_compare.
Acredito que dessa forma seja mais simples.
Se preferir, utilize a biblioteca de classes criadas pelo nosso amigo João Batista, que o William indicou acima.
Um abraço!
>
Experimente getimagesize() :seta: http://php.net/manual/en/function.getimagesize.php
Dá para descobrir também através da shell, se você tiver acesso à ela.
Um abraço!
Vlw @Matheus,
essa eu ja conhecia, todavia, tambem nao serve pois é um script de envio de emails com anexos e nao serao aceitas apenas imagens.
Acredita que eu cheguei a testar com um arquivo html no desespero? :lol: kkkkkkkkkkk.
Quando os arquivos vem por upload tudo bem, ja quando sao indicados ai e que to com problemas. Por isso, aproveitando, acho pertinente a pergunta: Alguem sabe commo $_FILES identifica o type?
Cara, o $_FILES é identificado pelo navegador, portanto é inseguro.
Tente o seguinte:
function mime ($arquivo) {
if (!function_exists ('mime_content_type')){
return (!ini_get('safe_mode')) ? trim(exec('file -bi '.escapeshellarg($arquivo))) : FALSE;
} else {
return mime_content_type($arquivo);
}
}>
Para manter a compatibilidade você pode criar uma função e dentro dela uma condição para verificar a versão do PHP, se for menor que a versão 5.3.0 você usa a função mime_content_type, se for igual ou maior você usa a finfo_file. Para fazer a comparação com a versão do PHP você pode usar a função version_compare.
Acredito que dessa forma seja mais simples.
Verdade @Leo, boa opcao!
Voce sabe me precisar ate que versao mime_content_type() esta disponivel? Ela e segura?
Vlw.
>
Alguem sabe commo $_FILES identifica o type?
Neste caso o mime-type é enviado pelo browser. Inclusive, se você enviar o mesmo arquivo com navegadores diferentes irá notar que em alguns casos o mime fica diferente. ;)
>
Veja:
@Bruno,
obrigado e desculpe nao agradescer antes, to esperando ve se aparece alguma sugestao mais simples que a implementacao desta classe, que por sinal deve ter dado um trabalho imenso ao @Joao.
Obrigado peloa ajuda mais uma vez @Bruno.
>
Cara, o $_FILES é identificado pelo navegador, portanto é inseguro.
Tente o seguinte:
function mime ($arquivo) {
if (!function_exists ('mime_content_type')){
return (!ini_get('safe_mode')) ? trim(exec('file -bi '.escapeshellarg($arquivo))) : FALSE;
} else {
return mime_content_type($arquivo);
}
}
:D
Eu mantenho exec desabilitada no php.ini. As razoes acho que nao preciso citar ne...
Eita %$%#¨#%$ dificil! Deveria ser tao simples...
>
>
Alguem sabe commo $_FILES identifica o type?
Neste caso o mime-type é enviado pelo browser. Inclusive, se você enviar o mesmo arquivo com navegadores diferentes irá notar que em alguns casos o mime fica diferente. ;)
Vixi @Leo e @Mateus,
imaginava que fosse de uma forma mais segura!
Não confio mais no $_FILES['type']. A solução que conseguir aqui vou usar ate nos uploads a partir de hoje.
Obrigado.
Minha última recomendação é transferir sua aplicação para uma hospedagem que tenha suporte nativo à estas funções básicas, tipo a minha... :lol:
Se tiveres interesse, trabalho com hospedagens, revendas, vps, streaming, tudo que precisares, e alocados nacionalmente.
Ainda recomendo que testes a classe do JBN. Deve possuir algum work-around para a situação.
[]'s
>
Minha última recomendação é transferir sua aplicação para uma hospedagem que tenha suporte nativo à estas funções básicas, tipo a minha... :lol:
Se tiveres interesse, trabalho com hospedagens, revendas, vps, streaming, tudo que precisares, e alocados nacionalmente.
Ainda recomendo que testes a classe do JBN. Deve possuir algum work-around para a situação.
[]'s
Hehehehe! beleza brother. Eu mantenho meu dedicado e um vps pra testes, o pro e que tenho clientes de sistemas nas mais variadas situaçoes... win e linux, php 5.1 .2 .3 e por ai vai...
Vou pesquisar a classe que falou. Vlw a forca mais uma vez!
Criei aqui a seguinte função:
<?php
function getMime($file) {
if (function_exists('finfo_file')) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file);
finfo_close($finfo);
return $mime;
}
return mime_content_type($file);
}
$path_file = dirname(__FILE__) . '/imagem.jpg';
var_dump(getMime($path_file));
Saída:
>
string(10) "image/jpeg"
;)
E isso mesmo @Leo,
vou ter que usar uma destas ou implementar a classe do @Joao, sugerida pelo @Bruno.
Nunca imaginei que uma coisa tao simples pudesse dar tanta dor de cabeça! :angry:
E isso, obrigado a todos! SOLVED!
Abraços.
:joia:
>
to esperando ve se aparece alguma sugestao mais simples que a implementacao desta classe, que por sinal deve ter dado um trabalho imenso ao @Joao.
Utilizar essa classe não demanda implementação, ela é uma classe concreta, basta utilizá-la.
O arquivo magic contido nesse pacote é o mesmo utilizado pelo file, a implementação é bem simples, basta interpretar o conteúdo do arquivo em comparação com o arquivo magic. A versão que está no code e que também está no git utiliza a versão antiga do arquivo magic, porém já estou atualizando o interpretador para adequar ao novo formato.
>
Ainda recomendo que testes a classe do JBN. Deve possuir algum work-around para a situação.
De fato, a identificação do mime do arquivo é feita baseada na interpretação do conteúdo, portanto é segura.
O único porém, é que utilizei uma versão antiga do arquivo magic, mas já estou ajustando o código para o novo formato.
O repositório no git :seta: https://github.com/netojoaobatista/magic
;)
Beleza @Joao!
Decidi por usar sua classe mesmo, pela seguranca e por ficar livre da questao das versoes do PHP e ambientes operacionais, pois creio que o funcionamento de seu objeto independa das versoes do php e do SO.
Alem do mais, conforme voce falou, a base mime foi atualizada, perfeito!
Mais um obrigado e parabens a voce pelo trabalho.
Abraço.
----------------
EDIÇÃO
----------------
@Joao!!!
Estou usando a sua classe, gostaria de esclarecer uma duvida sobre ela:
Como posso adicionar suporte a alguns formatos de arquivo, por exemplo: png do fireworks nao funciona. Retorna false. Atualizando o arquivo magic?
Um pouco mais alem:
Deve ter algum arquivo magic parecido no sistema win ou linux, posso usa-lo? Supondo que ele tenha suporte a todas as extensoes conhecidas...
>
Como posso adicionar suporte a alguns formatos de arquivo, por exemplo: png do fireworks nao funciona. Retorna false. Atualizando o arquivo magic?
Sim, com a atualização do arquivo magic que estou fazendo, os arquivos png passarão a funcionar.
>
Um pouco mais alem:
Deve ter algum arquivo magic parecido no sistema win ou linux, posso usa-lo? Supondo que ele tenha suporte a todas as extensoes conhecidas...
Esse é o magic do linux, o mesmo utilizado pelo file, mas é um arquivo magic antigo e, por isso não tem todos os tipos que conhecemos.
O problema é que não é simplesmente ir até /usr/share/mime/magic e pegar o novo. Esse arquivo, apesar de identificar muito mais tipos de arquivos, possui um formato diferente do utilizado e, por isso, eu terei que modificar o parser.
>
Esse é o magic do linux, o mesmo utilizado pelo file, mas é um arquivo magic antigo e, por isso não tem todos os tipos que conhecemos.
O problema é que não é simplesmente ir até /usr/share/mime/magic e pegar o novo. Esse arquivo, apesar de identificar muito mais tipos de arquivos, possui um formato diferente do utilizado e, por isso, eu terei que modificar o parser.
Aha! Entendido.
Eu testei ontem a noite e era isso mesmo, quando pus o magic do meu centos [ /usr/share/mime/magic ] de 400kb (pensei eita @$!%$#%!$%, agora vai pegar tudo! rsrsrs) +/- da erro no parser, alguns caracteres nao sao reconhecidos pela classe.
Estudando um pouco mais a classe e os formatos do magic (string, integer e etc) do linux e o do apache (que funciona), por exemplo, percebi as diferencas entendi os erros.
Eu ate consegui fazer funfar o png, pegando a parte do codigo do png de um arquivo magic que nao lembro qual e colocando no seu, mas claro, foi so um paliativo.
Em suma, fico no aguardo de sua atualizacao do magic compativel com a classe.
Por favor, se possivel, me notifique via mp ou por aqui quando a atualizaco do aruqivo magic no git estiver disponivel.
Obrigado pela resposta e bom dia @Joao.
Veja:
http://code.imasters.com.br/index.php?/topic/117-mime-magic-recuperando-o-content-type-de-um-arquivo/