Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

InterPlanet

[Resolvido] Mime type

Recommended Posts

Ola pessoal!

 

To com uma duvida cruel! :D

Como identificar o tipo mime do arquivo?

 

Ja tentei:

- Classe File Information (finfo): não é nativa, precisa carregar a extensao magic_open library e so depois do PHP 5.3

- pathinfo(): retorna extensao, nao o mime, e outras informacoes

- mime_content_type(): deprecated. No PHP 5.3.5, que uso, nem existe mais.

 

Alguma luz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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);
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

@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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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"

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.