Jump to content


Photo

Upload / Thumbnail


  • Faça o login para participar
16 replies to this topic

#1 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 20/06/2008, 09:51

Nome: Upload
Versão: 20080520
Requisito: PHP5, GD2
Funcionalidade: Classe para o envio de imagens com possibilidade de gerar miniaturas utilizando métodos de crop e marca d'água. :)
Exemplos: Utilizando Crop, Utilizando Marca d'água (Caravelas, BA)

Comentários: Mais um dentre os muitos scripts encontrados na web para upload de imagens e para gerar miniaturas. A documentação não é lá grande coisa mas dá pra entender, procurei deixar o código bem limpo para o bom entendimento. Livre para compartilhar e adaptar. ;)

Segue abaixo um exemplo de utilização:

<?php

include("upload.class.php");

// Instanciando a classe passando $_FILES e uma sugestão de nome das imagens geradas.
$obj = new Upload($_FILES['arquivo'], "upload_test");

// Vetor de segurança, o qual será utilizado para fazer a verificação da imagem submetida.
// Estes são as quatro possibilidades de chave deste vetor. Nenhuma delas é obrigatória.
$arr_security = array(
						'min_dimension' => 480,
						'max_dimension' => 1024,
						'mime' => array('image/jpg', 'image/jpeg'),
						'max_size' => 614400
					);

// Verificando se a imagem passará pelo método de segurança.
if( !$obj->security($arr_security) )
{
	echo "<pre>";
	print_r($obj->getError());
	echo "</pre>";
}
else
{
	// Criando uma miniatura com os quatro lados iguais.
	$obj->createSquareThumb(100, "uploads");
	
	// Criando uma miniatura proposrcionalmente menor.
	$obj->createThumb(640, "uploads", '_thumb', "marcadagua.png");
	
	// Mesma imagem submetida salva no diretório.
	$obj->send("uploads");
}

?>

Classe em ação: http://pauloandreget...om.br/thumb.php

Os dois vetores exibidos neste exemplo após o upload representa a superglobal $_FILES e as características da imagem temporária. (ok2)

:excl: NOTA: Caso o segundo parâmetro do construtor da classe não esteja definido, o nome será gerado automaticamente baseado nas funções mktime() e md5(). Como neste exemplo eu defini, todos os uploads de teste terão o mesmo endereço, a cada teste haverá a sobreposição.

Thas all folks! Não é uma brastemp mas funciona! :P

Contribuição

Em especial agradeço ao bimonti pela contribuição na parte de crop. :D

Até mais

Attached Files


Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#2 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 20/06/2008, 10:02

Caraca mano ... esse bimonti manja mesmo hein... <_<

PS.: Ficou show de bola... gostei. parabéns!
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#3 nakamura

nakamura

    Novato no fórum

  • Usuários
  • 23 posts
  • Sexo:Não informado

Posted 10/07/2008, 07:42

muito legal o script e se eu quisesse que a imagem ficasse em 150x100?

// Criando uma miniatura com os quatro lados iguais.
$obj->createSquareThumb(100, "uploads");


e nao entendi o que quer dizer o 640 deste trecho:

// Criando uma miniatura proposrcionalmente menor.
$obj->createThumb(640, "uploads", '_thumb', "marcadagua.png");


desculpe tantas duvidas, mas to comecando agora. Abracos.

lwirkkmeu herói hehe


#4 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 10/07/2008, 08:59

Olá, seja bem vindo ao fórum! :)

Para a primeira pergunta, como será formado uma miniatura com os quatro lados iguais não tem como deixá-lo da forma que você sugeriu, a menos que você modifique a classe, mais especificamente no método createSquareThumb(), que perderá o sentido do nome. :P

O 640 indica o tamanho máximo do thumb, seja altura ou largura, mas sempre obedecendo o tamanho proporcional da imagem original.

[]'s (y)Até mais
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#5 nakamura

nakamura

    Novato no fórum

  • Usuários
  • 23 posts
  • Sexo:Não informado

Posted 10/07/2008, 09:32

obrigado pelas boas-vindas e pelo esclarecimento vlw mesmo.

lwirkkmeu herói hehe


#6 Fr4nc0w

Fr4nc0w

    Novato no fórum

  • Usuários
  • 19 posts
  • Sexo:Não informado

Posted 17/07/2008, 23:32

Muito bom o script em, vendo em funcionamento achei muito interessante.

Mas então, sou relativamente iniciante no php..

então quero um auxlio, GD2 eu instalo ou ele existe simplesmente? é habilitavel? todos servers tem isso instalado?

É por que fui testar seu script em localhost e não funcionou.. eu copiei o codigo fonte da pagina, mudei o action do form pra pagina que coloquei o codigo na msm pasta coloquei a Class e mesmo assim não funcionou..

Teria alguma dica de como por para funcionar, por enquanto acho que fiz tudo certo, mas pode ser que eu esteja errando em algo.


flw e vlw desde já.

#7 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 18/07/2008, 09:28

Olá, normalmente os servidores já tem a biblioteca GD2 habilitada sim, para o caso de um servidor local, verifique a existência dela criando um arquivo com phpinfo() e procure pela seção gd para ver se GD Support está habilitada (enabled). Caso não esteja, abra seu arquivo de configuração php.ini e faça uma busca por extension=php_gd2.dll, caso exista um ponto e vírgula no início da linha, retire-o. Feito isto, reinicie seu apache e teste novamente.

[]'s (ok2)Até mais
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#8 Fr4nc0w

Fr4nc0w

    Novato no fórum

  • Usuários
  • 19 posts
  • Sexo:Não informado

Posted 19/07/2008, 22:03

Obrigado cara..vou dar uma testada aqui..

flw

#9 Eloih

Eloih

    Novato no fórum

  • Usuários
  • 15 posts
  • Sexo:Masculino
  • Localidade:Ubatuba - SP

Posted 29/07/2008, 14:54

eu so quero gerar uma img de 640*480 apartir de uma img maior, sem adicionar a marca...

// Criando uma miniatura com os quatro lados iguais.
	$obj->createSquareThumb(100, "uploads");
	// Criando uma miniatura proposrcionalmente menor.
			   $obj->createThumb(640, "uploads", '_thumb', "marcadagua.png");
	// Mesma imagem submetida salva no diretório.
	$obj->send("uploads");}

devo somente comentar a linha que cria um thumb quadrado?

e para a img ser postada no server? configuro na class a parata e nome do arkivo a ser gravado?

Edição feita por: Eloih, 29/07/2008, 14:57.


#10 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 29/07/2008, 16:30

Olá Eloih! :D

Sim, para não gerar a imagem com os quatro lados iguais, basta comentar/excluir a linha com a chamada do método createSquareThumb e para não incluir a marca d'água na imagem gerada, basta remover o quarto parâmetro que indica o nome da marca d'água, este é opcional.

Para o nome do arquivo, você tem duas opções: você mesmo define o nome na chamada da classe pelo segundo parâmetro ou, removendo este parâmetro, o nome será gerado automaticamente. A fórmula que utilizei foi simplesmente um md5(mktime()).

A parte que me referi foi esta:

$obj = new Upload($_FILES['arquivo'], "upload_test");

Neste caso, irá sempre gerar uma imagem com o nome upload_test, sempre sobrescrevendo a cada upload. :)

Caso queira utilizar o nome original da imagem enviada, tente assim:

$arq = pathinfo($_FILES['arquivo']['name'])
$obj = new Upload($_FILES['arquivo'], $arq['filename']);

[]'s (ok2)Até mais
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#11 Eloih

Eloih

    Novato no fórum

  • Usuários
  • 15 posts
  • Sexo:Masculino
  • Localidade:Ubatuba - SP

Posted 29/07/2008, 17:30

:D (y)

#12 Nicholas Pufal

Nicholas Pufal

    Impossível: só existe até alguém duvidar e provar o contrário.

  • Usuários
  • 1655 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre

Posted 17/12/2008, 10:05

PA, faz tempo que não mexo com PHP e tô me embananando aqui para implentar a classe em um sisteminha de múltiplos uploads.

Eu vi na parte do constructor tu chama a superglobal, ou seja, se eu colocasse diretamente o nome da figura ali, ia dar erro em todo o funcionamento da classe. Acontece que ao chamar a superglobal $_FILES no funcionamento da classe, isso me inibe de criar um looping para pegar cada arquivo enviado e dentro desse looping fazer referência a cada um na classe, certo?

Para funcionar minha chamada teria que ser algo tipo (no caso da primeira chave):

$obj = new Upload($_FILES['campo_upload'][0], "upload_test");

Mas fazendo assim ficaria:

$_FILES['campo_upload'][0]['tmp_name']

Ou seja: errado. O certo é $_FILES['campo_upload']['tmp_name'][0].

Da forma que foi estruturado, tô tendo uma dificuldade brutal para adaptar para múltiplas imagens.

Deve ser banal... Mas se puder me dar uma luz, te agradeço muito.

Abraços!

Edição feita por: Firehalk, 17/12/2008, 10:06.

BLOG Touché Criação - Vamos trocar idéias? -> http://blog.touchecriacao.com.br/
// Links úteis: Busca || Regras
// Não respondo dúvidas via mensagem privada. Use o fórum para buscar ou perguntar.

#13 Paulo André

Paulo André

    Why so serious?

  • Ex-Admins
  • 5114 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte - MG
  • Interesses:O.Q.F.J.?

Posted 17/12/2008, 19:09

Opa, fala Fire!

Minha primeira aplicação real desta minha classe foi justamente para múltiplas imagens e eu fiz da seguinte forma: primeiro eu construo um vetor para colocar estes vetores globais $_FILES de cada imagem a ser enviada.

$file = $_FILES['file_photo'];

$arr_photo = array();
$counter = count($file['name']);
$new_counter = 0;

for($i = 0; $i < $counter; $i++)
{
	if( $file['name'][$i] != '' )
	{
		$arr_photo[$i]['name'] = $file['name'][$i];
		$arr_photo[$i]['type'] = $file['type'][$i];
		$arr_photo[$i]['tmp_name'] = $file['tmp_name'][$i];
		$arr_photo[$i]['error'] = $file['error'][$i];
		$arr_photo[$i]['size'] = $file['size'][$i];
		
		$new_counter++;
	}
}

Ou seja, neste primeiro momento eu driblei este problema que você citou criando um vetor onde cada valor deste vetor é outro vetor que possui as mesmas informações de $_FILES.

Daí pra frente então é só fazer uma iteração normal:

for($i = 0; $i < $new_counter; $i++)
{
	$obj = new Upload($arr_photo[$i], "upload_test");

	// $arr_photo[$i]['name'], $arr_photo[$i]['tmp_name'], $arr_photo[$i]['size']
}

Ai é só ir trabalhando com $obj.

Tenta ai e vê se resolve. (ok2)

[]'sAté mais
Paulo André G Rodrigues,
ex-administrador Fórum WMO.


www.CanalDev.com.br

#14 Nicholas Pufal

Nicholas Pufal

    Impossível: só existe até alguém duvidar e provar o contrário.

  • Usuários
  • 1655 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre

Posted 18/12/2008, 09:15

PA, valeu pela força.

Rolou certinho (y)

Eu dei uma leve alterada na classe tb, para suportar thumbs de tamanho fixo e não apenas calculado automaticamente.

No início da função createThumb():

public function createThumb( $size, $altura = "", $dest = "", $sufix = '_thumb', $watermark = false )
	{
		$image_w = $this->image_size[0];
		$image_h = $this->image_size[1];

		if (!empty($altura)) {
			
			$thumb_w = $size;
			$thumb_h = $altura;
			
		} else {
			
		$scale = min($size/$image_w, $size/$image_h);

			if( $scale < 1 )
			{
				$thumb_w = round($scale * $image_w);
				$thumb_h = round($scale * $image_h);
			}
			else
			{
				$thumb_w = $image_w;
				$thumb_h = $image_h;
			}
		
		}

Assim, quando for necessário ter um thumb de tamanho fixo, o primeiro parâmetro é ref. a largura e o segundo (novo) a altura.

$obj->createThumb(180, 135, "uploads", '_thumb', "");

Caso contrário é só deixar vazio esse novo parâmetro, que vai ficar da maneira padrão da classe:

$obj->createThumb(180, "", "uploads", '_thumb', "");

Valeu!

Edição feita por: Firehalk, 18/12/2008, 09:17.

BLOG Touché Criação - Vamos trocar idéias? -> http://blog.touchecriacao.com.br/
// Links úteis: Busca || Regras
// Não respondo dúvidas via mensagem privada. Use o fórum para buscar ou perguntar.

#15 Nicholas Pufal

Nicholas Pufal

    Impossível: só existe até alguém duvidar e provar o contrário.

  • Usuários
  • 1655 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre

Posted 05/01/2009, 14:18

Outra pergunta.

Ao chamar algo assim:

$obj->createThumb(345, "uploads", '_thumb', "");
		$obj->createThumb(88, "uploads", '_thumb', "");

Não era para funcionar?

Ou só se pode chamar 1 vez cada função (por alguma razão) ?

Tentei assim, mas ele só gera o thumb de 88. O de 345 é ignorado.

Edit: Outra dúvida seria como definir o segundo createThumb com o mesmo nome do primeiro.

Desculpa a série de perguntas... Eu realmente tenho que me atualizar mais com relação ao PHP, mas por enquanto ainda não tive fôlego aqui.

Edição feita por: Firehalk, 05/01/2009, 14:26.

BLOG Touché Criação - Vamos trocar idéias? -> http://blog.touchecriacao.com.br/
// Links úteis: Busca || Regras
// Não respondo dúvidas via mensagem privada. Use o fórum para buscar ou perguntar.




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq