Carcleo 4 Denunciar post Postado Setembro 24, 2012 Pessoal. Bom Dia! Tenho o codigo abaixo que faz o upload de imagens com miniatura. Acontece, que ele faz normalmente todos os uplods normails. Porem, quando chega nas miniaturas, as miniaturas de arquivos com extensão png não estão sendo geradas. Ou seja, imagepng não funciona no meu código. Alguem pode me ajudar? Grato, <?php include "../config/constantes.php"; include "../config/conexao.php"; $foto = $_FILES['Filedata']; $nome = $foto['name']; $tipo = $foto['type']; $tmpname = $foto['tmp_name']; $extensao = pathinfo($nome, PATHINFO_EXTENSION); $imagem_nome = md5(uniqid(time())).".". $extensao; //Diretórios de Gravação das imagens $caminho_normal = "../../".endereco_normal."/".$imagem_nome; $caminho_mini = "../../".endereco_mini."/".$imagem_nome; if(move_uploaded_file($tmpname, $caminho_normal)) { $parametro = $_GET["parametro"]; $inserir_fotos_string = " insert into fotos (nome_fotos, id_produtos_fotos) values ('$imagem_nome',$parametro) "; $inserir_fotos = $conexao->query($inserir_fotos_string); //CRIA UMA NOVA IMAGEM if ($tipo ="image/pjpeg") { $imagem_original = imagecreatefromjpeg($caminho_normal); } else if ($tipo ="image/jpeg") { $imagem_original = imagecreatefromjpeg($caminho_normal); } else if ($tipo ="image/gif") { $imagem_original = imagecreatefromgif($caminho_normal); } else if ($tipo ="image/png") { $imagem_original = imagecreatefrompng($caminho_normal); } //Criaçao da miniatura //LARGURA $largura_original = imagesx($imagem_original); //ALTURA $altura_original = imagesy($imagem_original); //DEFINE OS PARÂMETROS DA MINIATURA $largura_mini = 150; $altura_mini = ($altura_original * $largura_mini) / $largura_original; //CRIA O THUMBNAIL $imagem_final = imagecreatetruecolor($largura_mini, $altura_mini); //COPIA A IMAGEM ORIGINAL PARA DENTRO imagecopyresampled($imagem_final, $imagem_original, 0, 0, 0, 0, $largura_mini+1, $altura_mini+1, $largura_original, $altura_original); //SALVA A IMAGEM if ($tipo ="image/pjpeg") { imagejpeg($imagem_final, $caminho_mini ,100); } else if ($tipo ="image/jpeg") { imagejpeg($imagem_final, $caminho_mini ,100); } else if ($tipo ="image/gif") { imagegif($imagem_final, $caminho_mini ,100); } else if ($tipo ="image/png") { imagepng($imagem_final, $caminho_mini); } //LIBERA A MEMÓRIA imagedestroy($imagem_original); imagedestroy($imagem_final); } ?> Carlos Rocha Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Setembro 24, 2012 Siga as orientações deste tópico e ative todas as exibições de erro. Após isso, teste novamente e veja se aparece algum erro. Você também pode executar o código abaixo e visualizar, na seção "gd" se a extensão png está habilitada ou não <?php phpinfo(); ?> Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Setembro 24, 2012 Seria isso: [php_GD2] extension=php_gd2.dll Ou isso? [gd] ; Tell the jpeg decode to ignore warnings and try to create ; a gd image. The warning will then be displayed as notices ; disabled by default ; http://php.net/gd.jpeg-ignore-warning ;gd.jpeg_ignore_warning = 0 Obs.: Em todo php.ini não achei a palavra png Outra coisa, no inicio dos meu codigos sempre faço: error_reporting(E_ALL); O que fazer agora? Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Setembro 24, 2012 Seria isso: [php_GD2] extension=php_gd2.dll Ou isso? [gd] ; Tell the jpeg decode to ignore warnings and try to create ; a gd image. The warning will then be displayed as notices ; disabled by default ; http://php.net/gd.jpeg-ignore-warning ;gd.jpeg_ignore_warning = 0 Obs.: Em todo php.ini não achei a palavra png Nenhum dos dois. Execute o script que postei, que aparecerão detalhes das configurações do php. Na seção "gd", haverá informações sobre suporte a jpeg, gif e png. É aquela informação que você tem que procurar Outra coisa, no inicio dos meu codigos sempre faço: error_reporting(E_ALL); O que fazer agora? lembre-se de mudar display_errors também ini_set( 'display_errors', 1 ); Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Setembro 24, 2012 Irmão, seria isso? Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Setembro 24, 2012 Analisando o codigo com mais atenção, verifiquei que essa condição: //CRIA UMA NOVA IMAGEM if ($tipo ="image/pjpeg") { ....... Sempre retornará true. Então, nunca chegarei na condição de imagem gif ou png. Então, os uploads serão realizados. Porem, as miniaturas de gif e png não. Somente as de jpeg e jpg serão criadas. Como contornar esse problema? Nem mesmo assim vei a funcionar: ... //CRIA UMA NOVA IMAGEM if ($tipo =="image/jpg") { $imagem_original = imagecreatefromjpeg($caminho_normal); } else if ($tipo =="image/gif") { $imagem_original = imagecreatefromgif($caminho_normal); } else if ($tipo =="image/png") { $imagem_original = imagecreatefrompng($caminho_normal); } //Criaçao da miniatura //LAGURA $largura_original = imagesx($imagem_original); //ALTURA $altura_original = imagesy($imagem_original); //DEFINE OS PARÂMETROS DA MINIATURA $largura_mini = 150; $altura_mini = ($altura_original * $largura_mini) / $largura_original; //CRIA O THUMBNAIL $imagem_final = imagecreatetruecolor($largura_mini, $altura_mini); //COPIA A IMAGEM ORIGINAL PARA DENTRO imagecopyresampled($imagem_final, $imagem_original, 0, 0, 0, 0, $largura_mini+1, $altura_mini+1, $largura_original, $altura_original); //SALVA A IMAGEM if ($tipo =="image/jpg") { imagejpeg($imagem_final, $caminho_mini ,100); } else if ($tipo =="image/gif") { imagegif($imagem_final, $caminho_mini ,100); } else if ($tipo =="image/png") { imagepng($imagem_final, $caminho_mini); } ... Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Setembro 24, 2012 Você estava usando "=" em vez de "==". Esse era o problema de sempre retornar true. Nem mesmo assim vei a funcionar: //CRIA UMA NOVA IMAGEM if ($tipo =="image/jpg") { $imagem_original = imagecreatefromjpeg($caminho_normal); } else if ($tipo =="image/gif") { $imagem_original = imagecreatefromgif($caminho_normal); } else if ($tipo =="image/png") { $imagem_original = imagecreatefrompng($caminho_normal); } //Criaçao da miniatura //LAGURA $largura_original = imagesx($imagem_original); //ALTURA $altura_original = imagesy($imagem_original); //DEFINE OS PARÂMETROS DA MINIATURA $largura_mini = 150; $altura_mini = ($altura_original * $largura_mini) / $largura_original; //CRIA O THUMBNAIL $imagem_final = imagecreatetruecolor($largura_mini, $altura_mini); //COPIA A IMAGEM ORIGINAL PARA DENTRO imagecopyresampled($imagem_final, $imagem_original, 0, 0, 0, 0, $largura_mini+1, $altura_mini+1, $largura_original, $altura_original); //SALVA A IMAGEM if ($tipo =="image/jpg") { imagejpeg($imagem_final, $caminho_mini ,100); } else if ($tipo =="image/gif") { imagegif($imagem_final, $caminho_mini ,100); } else if ($tipo =="image/png") { imagepng($imagem_final, $caminho_mini); } ... por que não? já testou? deu erro? qual foi a saída? adicione logs nos blocos. vai ajudar a "depurar" o programa. Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Setembro 25, 2012 Pois é. Não tem como fazer depurar (acho) pois o php esta sendo acessado via ajax. Dái, o ajax não deixa o php mostrar os erros. Veja: <h1 style="text-align:center">Insira novas fotos para este produto</h1> <h1> <br /></h1> <div id="uploader"></div> <div id="uploader_files"></div> <h1> <br /></h1> <a href="javascript:uploader.startUpload();">Enviar Fotos</a> | <a href="javascript:uploader.clearUploadQueue();">Cancelar todas as fotos</a><br /> E, o arquivo onde se encontra a função startUpload que é a que chama o php: function multiUpload(id, filesdiv, options) { /** * Default function to create the base html that will show files **/ this.createBaseHtml = function() { html = '<div><div class="c30p bold">Arquivo</div><div class="c100 ac bold">Tamanho</div>'; html += '<div class="c100 ac bold">Cancelar</div><div class="c30p bold">Progresso</div></div><div class="sep"></div>'; html += '<div id="files_list"></div>'; document.getElementById(filesdiv).innerHTML = html; } /** * Default function to add files to the default base html **/ this.onselected = function(e) { for (var file in e.files) { var info = e.files[file]; var divfile = document.createElement("div"); divfile.id = "file_"+info.id; divfile.innerHTML = '<div class="c30p">'+info.name+'</div><div class="c100 ac">'+size(info.size)+'</div><div class="c100 ac"><a href="javascript:'+id+'.cancelUpload('+info.id+');">X</a></div><div class="c30p progress"><div id="progress_'+info.id+'"> </div></div><div class="sep"></div>'; document.getElementById("files_list").appendChild(divfile); } } /** * Default function to remove the file from the default base html **/ this.onCancel = function(e) { var divfile = document.getElementById("file_"+e.id); document.getElementById("files_list").removeChild(divfile); } /** * Default function to show the upload progress **/ this.onprogress = function(e) { var progress = Math.ceil(Number(e.bytesLoaded / e.bytesTotal * 100)); var div = document.getElementById("progress_"+e.id); var val = String(progress)+"%"; div.innerHTML = val; div.style.width = val; } /** * Default function to clear the list of files **/ this.onClearQueue = function(e) { document.getElementById("files_list").innerHTML = ""; } this.prepareData = function(data) { var strData = ''; for (var name in data) strData += '&' + name + '=' + data[name]; return escape(strData.substr(1)); } /** * Default options */ this.op = { swf: '', //'upload.swf', path to the swf file script: '', //'upload_imagem.php', path to the upload script expressInstall: null, debug: true, scriptAccess: 'sameDomain', width: 137, // flash button width height: 27, // flash button height wmode: 'opaque', // flash button wmode method: 'POST', // method to send vars to the upload script data: {}, // data object to send with each upload. ex.: { foo: 'bar' } maxsize: 0, // maximum file size in bytes (0 = any size) fileDescription: '', // text to show in the combo box on the bottom of the selection window fileExtensions: '', // Extension to allow ex.: '*.jpg;*.gif;*.png' createBaseHtml: this.createBaseHtml, // Base html onMouseClick: function() {}, // function to execute when the user has clicked the uploader swf onselectionCancel: function() {}, // function to execute when the user presses "Cancel" in the selection window onselected: this.onselected, // function to execute when the user makes the selection onstart: function() {}, // function to execute when the uploader starts sending a file onerror: function() {}, // function to execute when an Error occurs onprogress: this.onprogress, // function to execute on every progress change of a single file upload onCancel: this.onCancel, // function to execute when a file upload is canceled onComplete: function() {}, // function to execute when a file upload is complete onAllComplete: function() {}, // function to execute when every file from the queue was sent onClearQueue: this.onClearQueue, // function to execute when the queue is cleared callback: function() {} // function to execute when the swf object is embeded } this.op = mergeRecursive(this.op, options); var op = this.op; DOMReady(function() { op.createBaseHtml(); }); var path = location.pathname; path = path.split('/'); path.pop(); path = path.join('/') + '/'; var params = {}; params.id = id; params.path = path; params.script = op.script; params.method = op.method; if (op.multi) params.multi = true; if (op.auto) params.auto = true; params.maxsize = op.maxsize; params.desc = op.fileDescription; params.ext = op.fileExtensions; if (op.data) params.scriptData = this.prepareData(op.data); swfobject.embedSWF(op.swf, id, op.width, op.height, '9.0.24', op.expressInstall, params, {'quality':'high','wmode':op.wmode,'allowScriptAccess':op.scriptAccess}, null, op.callback); this.el = function() { return document.getElementById(id); } this.setData = function(data) { this.el().setData(this.prepareData(data)); } this.startUpload = function() { this.el().startUpload(); } this.cancelUpload = function(fileid) { this.el().cancelUpload(fileid); } this.clearUploadQueue = function() { this.el().clearUploadQueue(); } } function mergeRecursive(obj1, obj2) { for (var p in obj2) { try { if (obj2[p].constructor == Object) obj1[p] = mergeRecursive(obj1[p], obj2[p]); else obj1[p] = obj2[p]; } catch(e) { obj1[p] = obj2[p]; } } return obj1; } function DOMReady(f) { if (/(?!.*?compatible|.*?webkit)^mozilla|opera/i.test(navigator.userAgent)) document.addEventListener("DOMContentLoaded", f, false); else window.setTimeout(f,0); } function size(val) { var kb = Number(Number(val)/1024).toFixed(1); return kb >= 1000 ? Number(kb/1024).toFixed(1) + " MB" : kb + " KB"; } Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Setembro 25, 2012 Não tem como fazer depurar (acho) pois o php esta sendo acessado via ajax. Dái, o ajax não deixa o php mostrar os erros. Sua aplicação acessa via ajax. Mas nada impede que você acesse a url diretamente, para testes. Mas caso realmente não queira acessar, você pode mudar o error_handler, para salvar os erros em arquivos de logs também pode, em vez de echo's, adicionar escritas a um arquivo de log Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Setembro 25, 2012 Achei o erro. Por incrivel que pareça, o erro, não estava no php nerm nos endereços. Estava na chamada à função imagejpg. Quando chamo ela, eu passo como nome da imagem, o nome que vem do forumulario. Mas, assim que eu faço o upload da imagem, eu mudo o nome dela criptografando com md5. Resultado, seu nome muda para um nome com 36 caractes mais a extenção. Precico agora saber como, tirar de uma string que contem um endereço inteiro e o nome, apenas o nome. Ou seja, apartir da da ultima incidencia do carcter / na string. Como fazer isso? A string vai me dar por ecxemplo: img/produtos/normal/806bcf4ff34a98e383fe54ff2541604b.jpg Preciso só do nome da imagem. fia assim: $nome_imagem_mini= explode('/', $imagem_nome); $quantos_cortes=count($nome_imagem_mini); $caminho_mini = "../../".endereco_mini."/".$nome_imagem_mini[$quantos_cortes]; Mas não funcionou Compartilhar este post Link para o post Compartilhar em outros sites
Kakashi_Hatake 267 Denunciar post Postado Setembro 25, 2012 :seta: basename :seta: pathinfo var_dump( basename( 'img/produtos/normal/806bcf4ff34a98e383fe54ff2541604b.jpg' ) ); // string '806bcf4ff34a98e383fe54ff2541604b.jpg' (length=36) var_dump( pathinfo( 'img/produtos/normal/806bcf4ff34a98e383fe54ff2541604b.jpg', PATHINFO_BASENAME ) ); // string '806bcf4ff34a98e383fe54ff2541604b.jpg' (length=36) Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Setembro 25, 2012 Tem alguma coisa errada nesse código? <?php include "../config/constantes.php"; include "../config/conexao.php"; $foto = $_FILES["Filedata"]; $nome = $foto["name"]; $tipo = $foto["type"]; $tmpname = $foto["tmp_name"]; $extensao = pathinfo($nome, PATHINFO_EXTENSION); $imagem_nome = md5(uniqid(time())).".". $extensao; //Diretórios de Gravação das imagens $caminho_normal = "../../".endereco_normal."/".$imagem_nome; if(move_uploaded_file($tmpname, $caminho_normal)) { $parametro = $_GET["parametro"]; $inserir_fotos_string = "insert into fotos (nome_fotos, id_produtos_fotos) values ('$imagem_nome',$parametro)"; $inserir_fotos = $conexao->query($inserir_fotos_string); //CRIA UMA NOVA IMAGEM if ($tipo =="image/jpg") { $imagem_original = imagecreatefromjpeg($caminho_normal); } else if ($tipo =="image/gif") { $imagem_original = imagecreatefromgif($caminho_normal); } else if ($tipo =="image/png") { $imagem_original = imagecreatefrompng($caminho_normal); } //Criaçao da miniatura //LARGURA $largura_original = imagesx($imagem_original); //ALTURA $altura_original = imagesy($imagem_original); //DEFINE OS PARÂMETROS DA MINIATURA $largura_mini = 150; $altura_mini = ($altura_original * $largura_mini) / $largura_original; //CRIA O THUMBNAIL $imagem_final = imagecreatetruecolor($largura_mini, $altura_mini); //COPIA A IMAGEM ORIGINAL PARA DENTRO imagecopyresampled($imagem_final, $imagem_original, 0, 0, 0, 0, $largura_mini+1, $altura_mini+1, $largura_original, $altura_original); $nome_imagem_mini=basename($imagem_nome); $caminho_mini = "../../".endereco_mini."/".$nome_imagem_min; //SALVA A IMAGEM if ($tipo =="image/jpg") { header("Content-type: image/jpg"); imagejpeg($imagem_final, $caminho_mini ,100); } else if ($tipo =="image/gif") { header("Content-type: image/gif"); imagegif($imagem_final, $caminho_mini ,100); } else if ($tipo =="image/png") { header("Content-type: image/png"); imagepng($imagem_final, $caminho_mini); } //LIBERA A MEMÓRIA imagedestroy($imagem_original); imagedestroy($imagem_final); } ?> Porque será que o upload é feito. Mas as miniaturas não? A biblioteca GD esta instalada para jpg, gif e png. Estranho! Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Setembro 25, 2012 Sabe o que que não dá para entender? É que, só as miniaturas não são geradas. Daí, pra testar, eu criei um arquivo liso com o form de upload de 1 arquivo só por vez (type=file) e testei nesse mesmo codigo. Resultado: deu certo. Tanto o upload quanto as miniaturas. E agora? O que fazer? Os depuradores não retornar erro. O php não retorna erro. Compartilhar este post Link para o post Compartilhar em outros sites