Carlos Rocha Posted September 23, 2012 at 10:11 PM Report #476310 Posted September 23, 2012 at 10:11 PM Pessoal. Boa noite! 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
yoda Posted September 24, 2012 at 04:51 PM Report #476389 Posted September 24, 2012 at 04:51 PM (edited) Ou seja, imagepng não funciona no meu código. Claro que funciona, a máquina tem sempre razão. Lê com atenção este bloco de código : 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); } Se ler não ajudar ainda assim a encontrar o problema, tenta fazer upload de um .gif Edited September 24, 2012 at 04:52 PM by yoda before you post, what have you tried? - http://filipematias.info sense, purpose, direction
Carlos Rocha Posted September 24, 2012 at 05:10 PM Author Report #476391 Posted September 24, 2012 at 05:10 PM Complermentado a duvida: Arquivos jpg, jpeg e gif. Uploads e miniaturas geradas normal. Arquivos png, somente uploads são feitos, miniatuaras não são geradas. Não achei o erro.,
yoda Posted September 24, 2012 at 05:18 PM Report #476395 Posted September 24, 2012 at 05:18 PM (edited) ($tipo ="image/pjpeg") Esta condição vai dar sempre TRUE. Edited September 24, 2012 at 05:18 PM by yoda 1 Report before you post, what have you tried? - http://filipematias.info sense, purpose, direction
Carlos Rocha Posted September 24, 2012 at 05:20 PM Author Report #476396 Posted September 24, 2012 at 05:20 PM (edited) Entendi cara. Analisando o código com mais atenção, verifiquei que essa condição: //CRIA UMA NOVA IMAGEM if ($tipo ="image/pjpeg") { ....... Sempre retornará true bem como você disse. 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? Edited September 24, 2012 at 05:37 PM by carcleo
taviroquai Posted September 24, 2012 at 06:10 PM Report #476399 Posted September 24, 2012 at 06:10 PM Grande yoda. 😄 Essa também me escapou... Deves comparar e não atribuir o valor, assim: 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); }
Carlos Rocha Posted September 24, 2012 at 06:26 PM Author Report #476400 Posted September 24, 2012 at 06:26 PM Pusha! 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 //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/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); } ...
HappyHippyHippo Posted September 24, 2012 at 06:47 PM Report #476402 Posted September 24, 2012 at 06:47 PM 1º - qual a versão do PHP que estás a correr ? 2º - ativa o output de erros e diz o que aparece IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Carlos Rocha Posted September 24, 2012 at 07:19 PM Author Report #476404 Posted September 24, 2012 at 07:19 PM PHP Version 5.3.6 Veja a GD: http://www.irajovemmuriae.com.br/gd.png
HappyHippyHippo Posted September 24, 2012 at 07:21 PM Report #476405 Posted September 24, 2012 at 07:21 PM 2º - ativa o output de erros e diz o que aparece IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Carlos Rocha Posted September 24, 2012 at 07:54 PM Author Report #476408 Posted September 24, 2012 at 07:54 PM (edited) Pois é. Não tem como fazer isso 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 o de se encontra a funçao 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"; } Edited September 24, 2012 at 07:57 PM by carcleo
HappyHippyHippo Posted September 24, 2012 at 08:02 PM Report #476409 Posted September 24, 2012 at 08:02 PM Pois é. Não tem como fazer isso pois o php esta sendo acessado via ajax. Dái, o ajax não deixa o php mostrar os erros. nem vou comentar essa afirmação. 2º - ativa o output de erros e diz o que aparece na resposta do ajax IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Carlos Rocha Posted September 24, 2012 at 08:40 PM Author Report #476415 Posted September 24, 2012 at 08:40 PM Olha descupa. Não sei muita coisa de Ajax. Só o basico mesmo. Olhei bem mas não localizei a saida do ajax nem achei onde colocar o error_reporting(E_ALL); Por favor, me ajuda em mais essa?
HappyHippyHippo Posted September 24, 2012 at 08:51 PM Report #476416 Posted September 24, 2012 at 08:51 PM que browser usas ? se for o chrome, carrega na tecla f12 e abre a aba network e faz o pedido ajax se for o firefox, instala o firebug, ativa a aba de rede e faz o pedido ajax se for o ie, acho que também é o f12 onde também tem uma aba network, mas o melhor é usares outro se for o opera, tens o dragonfly ao carregar no Ctrl+Shift+i onde novamente terás uma aba network e faz o pedido ajax se for o safari, não sei mas acho que existe uma extensão qualquer que faz o mesmo colocas o error_reporting(ALL) e o ini_set('display_errors', 1) colocas à cabeça do script chamado que faz o trabalho de gravação do ficheiro, afinal é ai que pretendes ver o erro que está a acontecer. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Carlos Rocha Posted September 24, 2012 at 09:54 PM Author Report #476421 Posted September 24, 2012 at 09:54 PM (edited) Fiquei um pouco perdido agora. Pois não é impressa nada ao usuario que o diga se foi ou não sucesso a geração das miniaturas. Na verdade, até há. Mas, o que há é uma barra de progresso. Só isso. Voce poderia, por favor, aproveitar meu codigo que esta aqui em cima, e destacar o local certo que devo colocar oque? Edited September 24, 2012 at 09:55 PM by carcleo
yoda Posted September 25, 2012 at 04:53 AM Report #476457 Posted September 25, 2012 at 04:53 AM (edited) Se não quiseres usar as ferramentas dos browsers (Firebug, Chrome Inspector, etc) podes pegar no código que tens, e colar antes dele o esqueleto básico de uma página que permita testar se o upload devolve erros. Exemplo : <html> <head></head> <body> <form action="" method="post" enctype="multipart/form-data"> <label for="file">Filename:</label> <input type="file" name="file" /> <br /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html> Se colares isto no inicio do ficheiro, basta que dentro do php incluas uma condição que envolva todo o código php : if ($_POST) { ... } Confirma também se estes caminhos existem usando a função is_dir() $caminho_normal = "../../".endereco_normal."/".$imagem_nome; $caminho_mini = "../../".endereco_mini."/".$imagem_nome; Edited September 25, 2012 at 04:58 AM by yoda before you post, what have you tried? - http://filipematias.info sense, purpose, direction
clera Posted September 25, 2012 at 08:09 AM Report #476460 Posted September 25, 2012 at 08:09 AM para comparar strings em php não seria melhor usar "===" ?
Carlos Rocha Posted September 25, 2012 at 10:05 AM Author Report #476469 Posted September 25, 2012 at 10:05 AM (edited) Yoda. Bom dia irmão. Não é que eu não esteja querendo usar os depuradores dos Browsers. É que não estou achando a saida hml mesmo. No meu codigo, há dois serviços: A) pegar a imagem original, de onde peguei quando a caixa do explorer se abriu, e fazer o upload. Essa etapa, fun ciona bem para qualquer extensão: jpg, jpeg, gif ou png. Ou seja, o upload esta sendo feito com sucesso e o endereço passado para o upload achado. B) uma vez que o upload foi feito com, sucesso, ir na pasta onde se encontra a imagem que foi uplodeada e, a partir dela, gerar uma miniatura.. Pois é. Essa etapa,não esta sendo feita. Porem, veja minhas constantes: define('endereco_mini', "img/fotos_produto/mini"); define('endereco_normal', "img/fotos_produto/normal"); Veja as variaveis que chamam os caminhos normal e mini: //Diretórios de Gravação das imagens $caminho_normal = "../../".endereco_normal."/".$imagem_nome; $caminho_mini = "../../".endereco_mini."/".$imagem_nome; DaÍ, O UPLOAD ($caminho_normal) é feito mas as miniaturas não. Porem, as duas pastas, tanto o mini quanto a normal, estão no mesmo diretorio(img/fotos_produto/ Não da pra ver o erro. Mas ma coisa percebi, nem jpg estava gerando miniatura Esse é o problema. Edited September 25, 2012 at 10:46 AM by carcleo
Carlos Rocha Posted September 25, 2012 at 11:13 AM Author Report #476472 Posted September 25, 2012 at 11:13 AM (edited) 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 Edited September 25, 2012 at 11:17 AM by carcleo
HappyHippyHippo Posted September 25, 2012 at 11:37 AM Report #476474 Posted September 25, 2012 at 11:37 AM 1º - o passo que estas a realizar de converter o nome do ficheiro para md5 não será o melhor - existe uma probabilidade (muito pequenina é certo) de dois ficheiros diferentes ficarem com o mesmo resultado md5 - através de outros métodos, o passo de encryptação deixa de ser necessário e é menos esse que o servidor tem de passar o seu tempo - se tiveres a registar os ficheiros em base de dados existe um valor identificador que elimina o ponto anterior 2º - $nome = substr($string, strrpos($string, "/")); IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now