Jump to content

Recommended Posts

Posted

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

Posted (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 by yoda
Posted (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 by carcleo
Posted

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

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); }
...
Posted (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 by carcleo
Posted

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
Posted (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 by carcleo
Posted (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 by yoda
Posted (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 by carcleo
Posted (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 by carcleo
Posted

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.