Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal... estou com um problema em um script de redimensionamento de imagem. Em outros provedores o script funciona, porem no provedor atual ocorre erro. O erro ocorre somente com fotos ou grande demais (quase 3 mb) ou com largura em pixels acima de 2.700 pixels. Pesquisei ja no google e em diversos foruns, alem de abrir diversos chamados tecnicos junto ao provedor.
O limite de upload do provedor é maior que o arquivo q tento upload, e o memory_limit esta em 35 mb (conforme eles falam). Tentei botar em tempo de execução um ini_set para 128 M, mas o erro permanece.
O erro que tenho eh o seguinte:
Fatal error: Allowed memory size of 36700160 bytes exhausted (tried to allocate 13056 bytes) in /home/httpd/html/sobracid.com.br/html/site/manager/paginas/public.detalhes.php on line 32
Após dar o erro, eu vou no FTP verificar a pasta das imagens não redimensionadas, e o arquivo esta la, porem na pasta de miniaturas, a imagem reduzida nao esta, ou seja, nao foi gravada no FTP. Desta forma, eu acredito que o erro possa estar relacionado ao redimensionamento da imagem, talvez algo com a biblioteca GD. O provedor, através de seu maldito suporte, apenas diz que fizeram teste com script deles de upload para arquivo de 8 mb e deu certo.
Eu sugeri trocar de provedor, porem o cliente nao tem mais o contato do ID no registro e tal. Entao estou ha 2 dias atras da solução. Baixei um programa que elimina o EXIF das fotos. Eliminei de uma foto com 3200 pixels de largura, tentei o upload, e deu o mesmo erro.
Abaixo vou colocar o codigo php que recebe a foto do form, faz o redimensionamento, e grava a foto grande numa pasta, e a foto pequena em outra:
ini_set("memory_limit","128M");
if (($logado_nivel == 1) OR ($logado_nivel == 2) OR ($logado_nivel == 4))
{
$acao_tip_ver=mysql_query("select * from ".$prefixo_db."not_tip where idtip='".$codigo."'");
while($rtip=mysql_fetch_array($acao_tip_ver))
{
$tip_nom=$rtip['tip_nom'];
}
$titulo_pagina = strtoupper($tip_nom);
if ($enviar_foto == 1)
{
if ($file != "")
{
$idir = "img/cache2g/"; // Endereço da Imagem
$tdir = "img/cache2p/"; // Endereço da Miniatura
$twidth = "96"; // Largura Máx para a miniatura
$theight = "128"; // Altura Máx para a miniatura
$twidth2 = "400"; // Largura Máx para a imagem
$theight2 = "300"; // Altura Máx para a imagem
$nome_foto = $_FILES['file']['name'];
$tipo_foto = $_FILES['file']['type'];
if ($tipo_foto == "image/jpg" || $tipo_foto == "image/jpeg" || $tipo_foto == "image/pjpeg")
{
$file_ext = strrchr($nome_foto, '.');
$copy = copy($_FILES['file']['tmp_name'], $idir . $nome_foto);
$image_temp = imagecreatefromjpeg($idir . $nome_foto);
$currwidth2 = imagesx($image_temp);
$currheight2 = imagesy($image_temp);
if ($currheight2 > $currwidth2)
{
$zoom2 = $twidth2 / $currheight2;
$newheight2 = $theight2;
$newwidth2 = $currwidth2 * $zoom2;
}
else
{
$zoom2 = $twidth2 / $currwidth2;
$newwidth2 = $twidth2;
$newheight2 = $currheight2 * $zoom2;
}
$temp_grande = imagecreate($newwidth2, $newheight2);
imagetruecolortopalette($image_temp, false, 256);
$palsize2 = ImageColorsTotal($image_temp);
for ($i = 0; $i < $palsize2; $i++)
{
$colors2 = ImageColorsForIndex($image_temp, $i);
ImageColorAllocate($temp_grande, $colors2['red'], $colors2['green'], $colors2['blue']);
}
imagecopyresized($temp_grande, $image_temp, 0, 0, 0, 0, $newwidth2, $newheight2, $currwidth2, $currheight2);
unlink($idir . $nome_foto);
imagejpeg($temp_grande, $idir . $nome_foto);
imagedestroy($image_temp);
$simg = imagecreatefromjpeg($idir . $nome_foto);
$currwidth = imagesx($simg);
$currheight = imagesy($simg);
if ($currheight > $currwidth)
{
$zoom = $twidth / $currheight;
$newheight = $theight;
$newwidth = $currwidth * $zoom;
}
else
{
$zoom = $twidth / $currwidth;
$newwidth = $twidth;
$newheight = $currheight * $zoom;
}
$dimg = imagecreate($newwidth, $newheight);
imagetruecolortopalette($simg, false, 256);
$palsize = ImageColorsTotal($simg);
for ($i = 0; $i < $palsize; $i++)
{
$colors = ImageColorsForIndex($simg, $i);
ImageColorAllocate($dimg, $colors['red'], $colors['green'], $colors['blue']);
}
imagecopyresized($dimg, $simg, 0, 0, 0, 0, $newwidth, $newheight, $currwidth, $currheight);
imagejpeg($dimg, $tdir . $nome_foto);
imagedestroy($simg);
imagedestroy($dimg);
$sucesso_foto = 1;
}
else
{
print '<font color="#FF0000">ERROR: Unable to upload image.</font>';
print '<font color="#FF0000">ERROR: Wrong filetype (has to be a .jpg or .jpeg. Yours is ';
print $file_ext;
print '.</font>';
}
echo "<br>";
echo "<img src='".$tdir.$nome_foto."'>";
echo "<br />";
echo "<img src='".$idir.$nome_foto."'>";
}
else
{
$sem_imagem = 1;
}
}
Lembrando: mesmo neste (maldito) provedor, com fotos pequenas, de 1 ou 2 mb, e que não ultrapassem 2.500 pixels (aproximadamente) de largura, não ocorre erro. A foto é redimensionada, sendo gravada corretamente na pasta de miniaturas, e a foto grande tambem vai pra pasta de fotos grandes, tudo de forma correta.
Lembrando 2: em outro provedor, usando a mesma foto que dá problema no provedor atual, funciona.
Pergunto: alem do memory_limit, o que pode estar trancando o script??
O provedor X não está ajudando em nada, o suporte deles é amador (os caras tem nome, acreditem) e apenas lavam as maos.
Agradeço qq ajuda!!
Carregando comentários...