Ir para conteúdo

POWERED BY:

Arquivado

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

OtavioVR

UPLOAD de Fotos JPG - erro diferente dos já discutidos

Recommended Posts

Pode até ser mas então todos sites feitos em php teriam esse problema, certo? Como é que vários sites que recebem e redimensionam fotos funcionam sem problemas?

Então como resolver isso?

O script que eu postei aqui verifica e recebe a foto, redimensiona e salva na pasta do servidor.

Existe outra função além de imagecreatefromjpeg() ou outro script que faça o que eu preciso?

Obrigado pela atenção.

Fico aguardando o retorno.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez seu php.ini esteja definido para receber somente arquivos com até 2mb (o padrão), e retorna um erro ao criar imagens maiores que isso. Verifique isto, pois de qualquer forma é fácil alterar este limite.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O script que eu postei aqui verifica e recebe a foto, redimensiona e salva na pasta do servidor.
Existe outra função além de imagecreatefromjpeg() ou outro script que faça o que eu preciso?

isso está muito relativo.

 

precisaria ver essa imagem em específico. pois é a imagem que esta em conflito com o codigo e nao o codigo em conflito com a imagem

 

 

 

no caso o photoshop, versao, MacOS inseria algumas tags XML antes do cabeçalho da imagem.

algumas dessas imagens, nem mesmo o visualizador de imagens do windows conseguir abrir. Algumas abria mas apareciam corrompidas.

comentei isso sobre um caso específico. Não quer dizer que acontece com todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente usar esse programa:

http://baixaki.ig.com.br/download/Exif-Tag-Remover.htm

 

se você ler os meus tópicos vai ver um tópico falando de SNAP em PHP, por que eu tinha um problema com alojamento de memoria no servidor por causa desses EXIF.

 

então mandei pro meu cliente um programa para limpar essas informações, assim ele envia e vai normal.

 

Porem teve uma vez que enviei ao meu cliente outro programa para fazer o mesmo e ele ocorria essa falha igual a que você citou, percebi que a limpeza não era 100% ou era mal feita.

 

Por isso tem de saber qual programa usar ;)

 

Ps.: em php sobre EXIF no maximo que você vai conseguir é ler essas informações.

Quanto a redimensionar uma foto só usando a GD(PHP) mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Silverfox e Hinom, isso é inviável. Imagina se todas as pessoas que usarem o site tiverem que limpar o EXIF antes de enviar uma foto.

Isso está fora de cogitação. Existem milhões de sites na net que recebem fotos dos usuários. Nenhum pede pra limpar EXIF antes de enviar.

Se só dá pra tratar foto via GD do php e tem esse problema, então é deficiência da linguagem.

Vamos resumir o problema. Vou colar aqui o erro que está dando. Isso está lá no início do post.

 

 

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG library reports unrecoverable error: in H:\wamp\www\projeto\redimensiona.php on line 17

 

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: 'h:/wamp/tmp\php55.tmp' is not a valid JPEG file in H:\wamp\www\projeto\redimensiona.php on line 17

 

 

ESSE ERRO NÃO ACONTECE COM APENAS UMA FOTO. EU PEDI PARA VÁRIAS PESSOAS ME ENVIAREM FOTOS JPG E PUDE VERIFICAR QUE O ERRO ACONTECEU COM VÁRIAS FOTOS MAS NÃO COM TODAS.

 

É isso que tá esquitito!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

bem pode ser a versão do seu GD que pode estar desatualizada tambem, pra mim em parte não é DEFICIENCIA e sim "suporte"

 

o problema é que JPG é um tipo de imagem que não é "GLOBAL" entende o formato dela varia não tem só o "exif", acredite fiquei um mês com o mesmo proplema e tambem achava que usar um programa não era viavel, mas foi a unica maneira que encontrei =/

 

já teve vez que fui enviar foto para o orkut de celular e dava erro toda hora, eram de celularm, o problema não era exif e sim que o formato estava "danificado" rodava normal no PC mas no orkut não ae fui obrigado a tratar as fotos ;)

 

eu sei que é ruim usar o programa você acha q meu cliente não reclamou? Reclamou sim.

então a solução convense-lo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Silverfox e Hinom, isso é inviável. Imagina se todas as pessoas que usarem o site tiverem que limpar o EXIF antes de enviar uma foto.

Isso está fora de cogitação. Existem milhões de sites na net que recebem fotos dos usuários. Nenhum pede pra limpar EXIF antes de enviar.

Se só dá pra tratar foto via GD do php e tem esse problema, então é deficiência da linguagem.

Vamos resumir o problema. Vou colar aqui o erro que está dando. Isso está lá no início do post.

por isso pedi pra enviar uma dessas fotos

 

para encontrarmos uma soluçao..

 

 

mas talvez seja a versão do php, tente atualizar e ver o que acontece.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hinom e Silverfox, resolvi parte do problema e acho que isso pode ajudar muita gente que está na mesma situação que eu. Vamos lá:

Aproveitando a dica do Silverfox, pesquisei no manual do PHP sobre as informações das fotos(EXIF) e cheguei nas funções exif_read_data() e exif_imagetype().

 

Quando um arquivo é JPG, a função exif_imagetype() é igual a 2(IMAGETYPE_JPEG).

Quando um arquivo é PNG, a função exif_imagetype() é igual a 3(IMAGETYPE_PNG).

 

Curiosamente, não entendi e não me perguntem porque, todas as fotos JPG que provocaram erro no script aparecem com exif_imagetype igual a 3. É por isso que aparecia a mensagem de erro "...is not a valid JPEG file...".

Eu acho que por algum motivo essas informações de EXIF inseridas na foto podem estar afetando a interpretação do arquivo pelo PHP.

 

Então para corrigir o erro, primeiro fiz a verificação do tipo de arquivo usando a função exif_imagetype() para depois usar a função imagecreatefrom correta(jpeg ou png).

Para vocês terem uma idéia do "esquisito", se o PHP entende que o exif_imagetype() de um arquivo JPG é igual a 3(IMAGETYPE_PNG), eu mando ele ler o arquivo com imagecreatefromPNG() e funciona perfeitamente. Dá pra entender?

 

Então o script do REDIMENSIONA.PHP ficou assim:

 

CODE

if (exif_imagetype($imagem)==2) { # 2 = IMAGETYPE_JPEG

$img_origem = imagecreatefromjpeg($imagem);

} elseif (exif_imagetype($imagem)==3) { # 3 = IMAGETYPE_PNG

$img_origem = imagecreatefrompng($imagem);

}

 

... o restante continua a mesma coisa.

 

Mas como eu disse no início, resolvi PARTE do problema, mas acho que esse erro agora é mole pra vocês:

Ao tentar fazer o upload de um arquivo PNG de 831K por exemplo, aparece o seguinte erro:

 

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 4292 bytes) in C:\wamp\www\projeto\redimensiona.php on line 39

 

Essa linha 39 é seguinte:

 

$img_origem = imagecreatefrompng($imagem);

 

Só que eu estou permitindo o upload de arquivos de até 2Mb. Arquivos PNG pequenos de 2K, 10K e até um de 500K estão funcionando corretamente mas parece que apartir de um certo tamanho dá esse erro.

Como resolvo isso?

Obrigado mais uma vez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais uma coisa:

Ativei a linha extension=php_exif.dll no php.ini do meu Wampserver que roda no meu micro mas como ativo essa extensão no servidor? Não consigo visualizar o arquivo php.ini e a pasta /php/ext está em branco, não tem nada.

Podem me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 4292 bytes) in C:\wamp\www\projeto\redimensiona.php on line 39

no inicio do codigo especifique:

 

ini_set("memory_limit","12M");

 

se a sua conta nao possuir privilegios nao poderá alterar em tempo de execução..

para isso entre em contato com o suporte do serviço de hospedagem

 

 

 

Ativei a linha extension=php_exif.dll no php.ini do meu Wampserver que roda no meu micro mas como ativo essa extensão no servidor? Não consigo visualizar o arquivo php.ini e a pasta /php/ext está em branco, não tem nada.

Podem me ajudar?

entre em contato com o suporte do serviço de hospedagem

 

 

quanto ao problema das imagens

tem como você saber qual a procedência desssas imagens ? qual software foi usado, como foi covnertido, etc..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faço upload das minhas imagens no servidor de uma maneira diferente e nunca tive problemas com upload de imagens. Vou postar aqui o código, não sei se vai ajudar mas pronto:

 

if(isset($_FILES["arquivo"]))
{
$arquivo = $_FILES["arquivo"];
$imagem_modificada = $arquivo["name"];

$imagem_modificada = str_replace(" ", "_", $imagem_modificada);
$imagem_modificada = str_replace("-", "_", $imagem_modificada);

$arquivo_temp = $arquivo["tmp_name"];

$imagem_modificada = str_replace(" ", "_", $imagem_modificada);
$imagem_modificada = str_replace("-", "_", $imagem_modificada);

$pasta_dir = "$diretorio_raiz"."imagens/";//diretorio dos arquivos
//se nao existir a pasta ele cria uma
$imagem_uploader = $pasta_dir . $imagem_modificada;
// Faz o upload da imagem
move_uploaded_file($arquivo_temp, $imagem_uploader);
$imagem = "http://urldosite/imagens/" . $imagem_modificada;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Hinom, vou fazer isso que você falou. Quanto aos arquivos, fica difícil saber a procedência porque recebi fotos de várias pessoas. Dá pra ver que aqui no meio tem foto escaneada, foto tirada por máquina digital e foto editada.

 

Ultimate, seu script não verifica o tipo de arquivo e nem redimensiona a foto.

O redimensionamento para mim é essencial pois poupa espaço no servidor.

 

Obrigado e abraço à todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hinom, coloquei ini_set() como você sugeriu mas o erro continuou. Mudei o memory_limit no php.ini para 12M mas continua dando a mensagem de erro. Veja que os valores(bytes) mudaram mas o erro continua.

 

Fatal error: Allowed memory size of 12582912 bytes exhausted (tried to allocate 5642907 bytes) in C:\wamp\www\projeto\redimimagem.php on line 39

 

E agora o que pode ser?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hinom, passei o memory_limit para 24M e funcionou.

Eu posso deixar um valor alto assim? Não vai me prejudicar em nada não? Por exemplo, se várias pessoas estiverem fazendo o upload de arquivos...

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu deixo em 80mb num servidor pentium 4 dual, 1Gb ram, 100gb hd

está com média de 500 acessos unicos por hora.

 

mas verifique as configurações de hardware do seu server

e também faça testes de benchmark e performance dos seus scripts.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ULTIMATE

 

desse modo não faz verificação do tipo da imagem

 

Você têm razão, então modifiquei aqui o código pra você. Faz mais do que o seu script faz:

 

<O SCRIPT ABAIXO FOI TESTADO E FUNCIONA PERFEITAMENTE>

 

<Neste script contém código produzido por: Fabyo - FelipeDD - OtavioVR - ULTIMATE

 

!Atenção! Abaixo as opções entre parênteses podem ser alteradas.

 

- Valida se a pessoa inseriu uma imagem no formulário após envio;

- Valida o tipo de imagem (jpg, gif ou png);

- Valida o tamanho da imagem (Máximo 500 kb);

- Faz upload da imagem para o servidor;

- Valida se foi realizado com sucesso o upload da imagem para então redimensioná-la;

- Redimensiona o tamanho da imagem (317x441);

 

CODE

 

if($_SERVER["REQUEST_METHOD"]== "POST")

{

 

if(isset($_FILES["arquivo"]))

{

$arquivo = $_FILES["arquivo"];

 

if ($arquivo["name"]!="" AND (!stristr($arquivo["type"],"jpeg") AND !stristr($arquivo["type"],"pjpeg") AND !stristr($arquivo["type"],"png") AND !stristr($arquivo["type"],"x-png") AND !stristr($arquivo["type"],"gif")))

{

echo '<script>window.alert("Tipo de arquivo inválido\nVocê será redirecionado para a página anterior."); </script>';

echo"<meta HTTP-EQUIV='Refresh' CONTENT = '0; URL= http://url_de_destino'>";

exit;

}

 

if($arquivo["size"] > 512000){

echo '<script>window.alert("O tamanho da imagem pode ter no máximo 500 kb."); </script>';

echo"<meta HTTP-EQUIV='Refresh' CONTENT = '0; URL= http://url_de_destino'>";

exit;

}

 

if (isset($arquivo['name']) AND (stristr($arquivo['type'],"jpeg") OR stristr($arquivo['type'],"pjpeg")))

{

$tipo_imagem = "jpg";

}

elseif (isset($arquivo['name']) AND (stristr($arquivo['type'],"png") OR stristr($arquivo['type'],"x-png")))

{

$tipo_imagem = "png";

}

elseif (isset($arquivo['name']) AND (stristr($arquivo['type'],"gif")))

{

$tipo_imagem = "gif";

}

 

 

$imagem_modificada = $arquivo["name"];

$imagem_modificada = str_replace(" ", "_", $imagem_modificada);

$imagem_modificada = str_replace("-", "_", $imagem_modificada);

 

$arquivo_temp = $arquivo["tmp_name"];

$imagem_modificada = str_replace(" ", "_", $imagem_modificada);

$imagem_modificada = str_replace("-", "_", $imagem_modificada);

 

$pasta_dir = "$diretorio_raiz"."imagens/";//diretorio dos arquivos

//se nao existir a pasta ele cria uma

$imagem_uploader = $pasta_dir . $imagem_modificada;

// Faz o upload da imagem

move_uploaded_file($arquivo_temp, $imagem_uploader);

$imagem = "http://url_do_site/imagens/" . $imagem_modificada;

 

}

 

//////////////// Redimensionar imagem ///////////////////////////////////////////////

 

// declara os tamanhos

$x = 317;

$y = 441;

 

// verifica se o arquivo existe

 

if (!file_exists($imagem_uploader))

{

echo $imagem . " não encontrada";

exit;

}

// vamos ler a imagem

 

if ($tipo_imagem == "jpg")

{

$lerimagem = imagecreatefromjpeg($imagem_uploader);

}

elseif ($tipo_imagem == "png")

{

$lerimagem = imagecreatefrompng($imagem_uploader);

}

elseif ($tipo_imagem == "gif")

{

$lerimagem = imagecreatefromgif($imagem_uploader);

}

 

// pegar a largura da imagem

$img_largura = imagesx($lerimagem);

 

// pegar a altura da imagem

$img_altura = imagesy($lerimagem);

 

// dar um nome padrão para a miniatura

 

$nome_miniatura = explode('.',$imagem_uploader);

$nome_miniatura = $nome_miniatura[0].".$tipo_imagem";

 

// Agora sim a gente pode criar a imagem

 

// definir o tamanho da nova imagem

 

$nova = imagecreatetruecolor($x,$y);

 

// agora é só copiar a imagem original para dentro da nova imagem

 

imagecopyresampled($nova,$lerimagem,0,0,0,0,$x+1,$y+1,$img_largura,$img_altura);

 

// salve o arquivo

if ($tipo_imagem == "jpg")

{

imagejpeg($nova,$nome_miniatura);

}

elseif ($tipo_imagem == "png")

{

imagepng($nova,$nome_miniatura);

}

elseif ($tipo_imagem == "gif")

{

imagegif($nova,$nome_miniatura);

}

 

// Pronto, fim. Libera a memória usada

 

imagedestroy($lerimagem);

imagedestroy($nova);

 

////////////////////////////////////////////////////////////////////////////////////////////////////////

}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ultimate,

 

o script em questão é do Otavio

 

e o que estamos discutindo é sobre um problema no formato de alguns arquivos JPG

 

a questão foi solucionada graças à dica do silverfox e ao empenho do Otavio

 

 

valew t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Otavio, não sei se já resolveu de outras formas o problema, mas o meu foi unica e exclusivamente problema com o tamanho da imagem q estava enviando!

 

Fui no php.ini e mudei a linha upload_max_filesize = 2M para 3M ...

 

simples assim...

 

t+

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.