Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

P3rukao

Upload de Imagens

Recommended Posts

Povu meu, eu tow apanhando aqui para fazer um sisteminha de upload de imagens multiplo para um servidor... =/

 

 

É o seguinte:

» Eu tenho um form com dois campos de envio de imagens (imagem destaque e imagem de localização);

» Esse form tem também alguns campos inputs para entradas de texto (como Nome, telefone, descrição, etc...), e tenho também um botão para adicionar mais campos de upload de imagens se for necessário;

» Para essas imagens adicionais, quando enviadas para o banco, cada imagem deve ser redimensionada para dois tamanhos, uma com tamanho maior (tipo 1024x768px no máximo) e outra menor (thumbnail de 100x100px);

 

O meu problema:

 

» A parte de enviar várias imagens eu já achei um script que faz isso... bem legalzinho.. Mas ele pega todos os inputs do formulário de uma vez.

foreach($_FILES as $arquivo){
		//enviamos o arquivo:
		varios($arquivo);
		Envia_Arquivo();
	}
E neste caso, ele também está usando classe para tratar cada etapa do processo, tratando nome do arquivo, tipo, extensão, daí já manda pro banco as imagens:

 

» COMO eu faço para definir quais campos serão enviados? tipo (se o nome do meu inputFile é ARQUIVO[], intão eu colocaria $_FILES['arquivo'] ????

 

 

 

Achei um outro script também que faz essa parte de enviar os inputFiles separados...

$imgDesc = $_FILES['imgDesc'];
	if ($imgDesc['name'] != ""){
		$diretoriotb = "thumbnails/";
		$nomeimgDesc = uniqid("tb_") . substr($imgDesc['name'], strlen($imgDesc['name'])-4);
		$ext = strtolower( substr($imgDesc['name'], strlen($imgDesc['name'])-3)); //pega a extensão do arquivo			  
		
		move_uploaded_file($imgDesc['tmp_name'], $diretoriotb . $nomeimgDesc );
		chmod($diretoriotb . $nomeimgDesc, 0777);
	}

O problema desse é que não está redimensionando os arquivos... ele simplemente muda o nome e envia para um diretório;

Nesse ultimo exemplo, eu tenho uma classe que redimensiona as imagens:

 

<?
include("foto.php");
class resize{
	
	var $foto;
	var $image;
	var $maxLargura;
	var $maxAltura;
	var $tam;
	//public $alt;
	var $alt;
	
	/**
	 * Construtor da classe
	 *
	 * @param String $file Nome do arquivo
	 * @param String $h Altura máxima do arquivo
	 * @param String $l Largura máxima do arquivo
	 *
	 * @return resize object
	 * 
	 * @uses $file Tem que obrigatoriamente ser JPG ou PNG
	 */
	function resize($file,$l,$h,$ext){

		//  Verifica o tipo do arquivo

		switch($ext){
			case 'png':
				$this->foto = new fotoPng($file);
				break;
			case 'jpg':
				$this->foto = new foto($file);
				break;
			case 'gif':
				$this->foto = new fotoGif($file);
				break;
		}
		
		
		$this->maxAltura = $h;
		$this->maxLargura = $l;
		$this->tam = $this->foto->tam;
		$this->alt = $this->foto->alt;
		
		if ($this->tam > $this->maxLargura){
			$this->ajeitaFoto();
		}
		if ($this->alt > $this->maxAltura){
			$this->ajeitaFoto();
		}
		
		$this->image = imagecreatetruecolor($this->tam, $this->alt);
		imagecopyresized($this->image,$this->foto->img, 0, 0, 0, 0, $this->tam, $this->alt, $this->foto->tam, $this->foto->alt);
		
	}
	
	/**
	 * Seta as novas dimensões da foto redimencionadas proporcionalmente
	 *
	 */	
	function ajeitaFoto(){
	
		if ($this->tam > $this->maxLargura){
			$percent = ($this->maxLargura/$this->tam );
			$percent= number_format($percent,"3",".","");
			$this->tam = $this->tam * $percent;		
			$this->alt = $this->alt * $percent;
		}
		
		if($this->alt > $this->maxAltura){
			$percent = ($this->maxAltura/$this->alt);
			$percent= number_format($percent,"3",".","");
			$this->tam = $this->tam * $percent;		
			$this->alt = $this->alt * $percent;
		}
		
		$this->tam = ceil($this->tam);
		$this->alt = ceil($this->alt);
		
	}
	
	
	/**
	 * Saves the new picture
	 *
	 * @param String $dirName Path Location
	 * @param String $nameFile File Name
	 * @param String $ext File extension (JPG,PNG or GIF)
	 *
	 * @return nome do arquivo
	 */	
	function save($dirName, $nameFile, $ext){
		if($dirName!=""){
			$dirName.="/";
		}
		
		if($nameFile!="" and $ext!="" and ($ext=="jpg" or $ext=="gif" or $ext="png")){			
			switch (strtolower($ext)){
				case "jpg":
					imagejpeg($this->image, $dirName.$nameFile.".jpg");
					break;
				case "gif":
					imagegif($this->image, $dirName.$nameFile.".gif");
					break;
				case "png":
					imagepng($this->image, $dirName.$nameFile.".png");
					break;
			}
		}
		return $nameFile.".".$ext;
	}
}
?>

<?
/**
 * Foto class, 
 * take the image attributes from jpeg
 * 
 * 
 * @author Germano Carvalho
 * @since 02/06/2007
 * @name foto.php
 * @version 1.01
 * @package Pitures
 * @subpackage Foto
 * 
 * @access public
 */


class foto{
	public $alt;
	public $tam;
	public $img;
	public $name;
	function foto($name){
		$dim = getimagesize($name);
		$this->tam = $dim[0];
		$this->alt = $dim[1];
		$this->img = imagecreatefromjpeg($name);
		$this->name = $name;
	}
}

/**
 * fotoPng class, 
 * take the image attributes from Png
 * 
 * 
 * @author Germano Carvalho
 * @since 02/06/2007
 * @name foto.php
 * @version 1.0
 * @package Pitures
 * @subpackage Foto
 * 
 * @access public
 */

class fotoPng{
	public $alt;
	public $tam;
	public $img;
	public $name;
	function fotoPng($name){
		$dim = getimagesize($name);
		$this->tam = $dim[0];
		$this->alt = $dim[1];
		$this->img = imagecreatefrompng($name);
		$this->name = $name;
	}
}

/**
 * fotoPng class, 
 * take the image attributes from GIF
 * 
 * 
 * @author Germano Carvalho
 * @since 23/01/2008
 * @name foto.php
 * @version 1.0
 * @package Pitures
 * @subpackage Foto
 * 
 * @access public
 */

class fotoGif{
	public $alt;
	public $tam;
	public $img;
	public $name;
	function fotoGif($name){
		$dim = getimagesize($name);
		$this->tam = $dim[0];
		$this->alt = $dim[1];
		$this->img = imagecreatefromgif($name);
		$this->name = $name;
	}
}
?>

A minha dúvida em relação a este ultimo eh:

» Como eu faço para usar essa classe para redimensionar a imagem e inclui-la no segundo exemplo de script qu eu mostrei mais acima?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dando UP no próprio post não vai resolver seu problema.

 

Faça uma função para reduzir o tamanho dessas imagens, ou uma pesquisada aqui mesmo no fórum ou no laboratório, você ira encontrar funções prontas e corrigidas.

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim... certo... mas...

Depois de redimensionar essa imagem... como eu vou movê-la para a pasta???

 

move_uploaded_file($imgDesc['tmp_name'], $diretoriotb . $nomeimgDesc );

Eu sei que é com essa função... mas no exemplo acima, está sendo usado um arquivo temporário...

Quando eu executar a minha funcção de redimensionar imagens, eu passo, nesse caso, o ultimo valor que ela retornar??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já criou a pasta coloca o caminho ou cria if para verificar se existe use mkdir e chmod para criar dinâmicamente

 

function save($dirName, $nameFile, $ext){
		if($dirName!=""){
			$dirName.="/";
		}

E como eu disse crie uma função que reduza a imagem em pixels para cada tipo de extensão, redimensionar altura e largura não precisa criar thumb.

 

e no lugar de var use public. etc...

 

var $foto;
	var $image;
	var $maxLargura;
	var $maxAltura;
	var $tam;

var já esta obsoleta.

 

Para upload multiplo este código tá bem fraco!!!!!!!

 

Fuiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu estou tentando usar a função resize deste post... mas não sei como pegar o valor retornado pela classe =$

$resizeThumb = new resize();
$resizeThumb->resize($imgDesc['name'],100,100,$ext);
move_uploaded_file($resizeThumb, $diretoriotb . $nomeimgDesc );

mas aqui não está funcionando... e nem eu sei como usar isso !!!

» Alguem sabe como ajudar???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom... pesquisei um pouco mais... e achei uma classe que está funcionando certinho.... eu alterei algumas coisas... mas enfim... está aqui para quem tiver a mesma duvida:

 

CÓDIGO DA CLASSE

<?php
	### Classe Upload
	### Autor: Xorna (falecomoxorna@blogdoxorna.com) Mantenha estes créditos!
	## Faz o upload de imagens, muda seu nome e redimensiona ao mesmo tempo
	# Versão 1.0
class upload{
	# Declaração das propriedades
	private $nome;
	private $arquivo;
	private $tipo;
	private $tamanho;
	private $temp;
	private $mime = array('image/jpeg','image/jpg','image/png','image/gif','image/pjpeg');
	private $ext;
	private $tamanho_max = 600000;
	private $nomeImagem;
	### Método construtor
	## Paramentro: o array do arquivo a ser gravado
	# Pega os dados a partir do array arquivo
	public function __construct($arquivo){
		$this->nome = $arquivo['name'];
		$this->tipo = $arquivo['type'];
		$this->tamanho = $arquivo['size'];
		$this->temp = $arquivo['tmp_name'];
	}

	# Verifica o MIME da imagem
	public function verifica(){
		if(in_array($this->tipo, $this->mime)){
			$valida = true;
		}else{
			$valida = false;
		}
		return $valida;
	}

	# Abre uma imagem de acordo com seu MIME
	public function abreImagem($img){
		switch($this->tipo){
			case "image/gif":
				$imagem = imagecreatefromgif($img);
				$this->ext = "gif";
				break;
			case "image/png":
				$imagem = imagecreatefrompng($img);
				$this->ext = "png";
				break;
			default:
				$imagem = imagecreatefromjpeg($img);
				$this->ext = "jpg";
			break;
		}
		return $imagem;
	}

	## Mero método para facilitar a vida de quem usa
	# Ele pega um path relativo e transforma em absoluto
	public function ajustaPath($path){
		$path = realpath($path);
		$path = str_replace("\\", "/", $path);
	}

	### Método para o upload
	## Parametros:
	## $nova_largura
	## $path (endereço relativo)
	## $novo_nome
	# abre a imagem, redimensiona e salva no lugar especificado com o nome especificado
	public function redimensiona_salva($nova_largura, $path, $novo_nome){
		if($this->verifica() && $this->tamanho <= $this->tamanho_max){
			$this->ajustaPath($path);
			$img = $this->abreImagem($this->temp);
			$largura_original = imagesx($img);
			$altura_original = imagesy($img);
			$razao = $altura_original/$largura_original;
			$nova_altura = $nova_largura * $razao;
			
			$nova_imagem = "";
			if($largura_original > $nova_largura)
			{			
				$nova_imagem = imagecreatetruecolor($nova_largura, $nova_altura);
			}
			else
			{
				$nova_imagem = imagecreatetruecolor($largura_original, $altura_original);
			}
			
			$nome = uniqid($novo_nome) . substr($this->nome, strlen($this->nome)-3);			
			$novo_nome = substr($nome,0, strlen($nome)-3);
			
			$this->nomeImagem = $novo_nome.".".$this->ext;
			
			imagecopyresampled($nova_imagem, $img, 0, 0, 0, 0, $nova_largura + 1, $nova_altura + 1, $largura_original, $altura_original);
			imagejpeg($nova_imagem, "$path/$novo_nome.$this->ext", 95);
		
			imagedestroy($img);
			imagedestroy($nova_imagem);
		}else{
			# Falta inventar algo para validar isso…
			# Inventa você aí…
		}
	}
	
	public function getNomeFile(){
		$nomeFile = $this->nomeImagem;
		
		return $nomeFile;
	}

	public function __destruct(){

	}
} //end class
?>

MODO DE USO DA CLASSE

<?
include 'classe.php';

$up = new upload($_FILES['arquivo']);

$largura_final = 100;
$path = "thumbnails/";
$novo_nome = "tb_";

$up->redimensiona_salva($largura_final, $path, $novo_nome);

echo "<br /> nome da imagem enviada: ".$up->getNomeFile();
?>

isto está funcionando agora...

mas irei modificar mais coisas ainda...

volto aqui se precisar

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguinte pessoal.... a classe acima está funcionando beleza quando eu quero passar um valor de um input estático....

 

O meu problema eh.. que agora eu estou tentando integrá-lo ao sistema de upload mutiplo que consegui montar... mas não está funcionando... e não estou entendendo o porque... Ô.õ

 

O que estou fazendo eh o seguinte:

 

Na página cadastroFotos.php, que eh a página onde tenho o meu form com os inputFiles para o envio das imagens...e javascript para envio adicionar inputs dinamicamente na pagina...

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Sistema Administrativo</title>

<script type="text/javascript">
	var n = 2;
	function adiciona_Upload() {		
		var p = document.createElement("p");
		p.setAttribute("style", "height:25px");
		
		var lbl = document.createElement("label");
		
		if(n<100) n = "00" + n;
		
		var input = document.createElement("input");
		//input.setAttribute("name", "imgFotos_"+n);
		input.setAttribute("name", "imgFotos[]");
		input.setAttribute("type", "file");
		input.setAttribute("size", "33");
		
		var inputHidden = document.createElement("input");
		inputHidden.setAttribute("name", "tipo"+n);
		inputHidden.setAttribute("id", "tipo"+n);
		inputHidden.setAttribute("type", "hidden");
		inputHidden.setAttribute("value", "foto");		

		var div = document.getElementById("mais_Upload");
		
		p.appendChild(lbl);
		p.appendChild(input);
		p.appendChild(inputHidden);
		div.appendChild(p);
		
		++n;
	}
</script>
</head>

<body>

<form class="principal" action="cadastro.php" onsubmit="return validaForm()"  method="post" enctype="multipart/form-data"> 
	   
	   	<p>
			<!--<label for="nome">Envio de Imagens</label>-->
			<span>Você pode enviar 'N' arquivos JPG, GIF ou PNG. (Tamanho máximo de 6MB por foto.) </span>			
		</p>
		
		<p>
			<label for="nome">Nome: </label>
			<input type="text" name="nome"  />
		</p>
		
		<p>
			<label for="img">Imagem Descritiva: </label>
		   	<input type="hidden" name="MAX_FILE_SIZE" value="10000000" />
			  <input class="input_file" type="file" name="imgDesc" size="33"  />
		</p>
		
		 <div id="mais_Upload">
		 	<p>
				<label for="nome">Imagens da Galeria: </label>
				<input type="hidden" name="MAX_FILE_SIZE" value="10000000" />
				<input class="input_file" type="file" name="imgFotos[]" size="33"  />
			</p>
		 </div>
		
		<p class="but">
			  <input type="button" value="Nova Imagem" onclick="adiciona_Upload()" id="btnNovaImg" />
		</p>
		
		<p>
			<label for="imgDesc">Imagem Localização: </label>
		   	<input type="hidden" name="MAX_FILE_SIZE" value="10000000" />
			  <input class="input_file" type="file" name="imgLocaliza" size="33"  />
		</p>			
		<p class="but">
			<input name="submit" type="submit" value="Enviar" />
		</p>
 
	</form>

</body>
</html>

 

E na página cadastro.php, que é a página que recebe os dados vindos do form.

<?
	include 'classe.php';

/*- dados do formulario -*/
	$original = array("<p>", "</p>");
	$troca   = array("", "");

	$nome = $_POST['nome'];
	$imgDesc = $_FILES['imgDesc'];
	$imgFotos = $_FILES['imgFotos'];
	$etapa = $_POST['etapa'];
	$descricao = str_replace($original, $troca, $_POST['texto']);	
	$imgLocaliza = $_FILES['imgLocaliza'];
	$ativar = $_POST["ativar"];
	if ($ativar=="") {				
		$ativar = 0;
	}
	else {				
		$ativar = 1;
	}
/*-----------------------------------------*/
/*- validação dos dados do form + imagens -*/
	//include 'validaCadastro.php';
/*-----------------------------------------*/

//- IMAGEM DE DESCRICAO	
	$upDesc = new upload($_FILES['imgDesc']);
	
	$largura_final = 100;
	$path = "thumbnails/";
	$novo_nome = "tb_desc_";
	
	$upDesc->redimensiona_salva($largura_final, $path, $novo_nome);
	
	echo "<br /> Imagem de Descrição: ".$upDesc->getNomeFile();
	
//- IMAGEM DA GALERIA
	
	$Fotos = $_FILES['imgFotos'];
	$upDesc = new upload($Fotos['name']);
   	$largura_final = 60;
	$path = "thumbnails/";
	$novo_nome = "tb_fotos_";
	echo "<br /> Imagem da Galeria: ";
	
	for($i = 0; $i < sizeof($Fotos['name']); $i++)
	{
		// Passa valores da iteração atual
		$Nome	= $Fotos['name'][$i];
		$Tamanho = $Fotos['size'][$i];
		$Tipo	= $Fotos['type'][$i];
		$Tmpname = $Fotos['tmp_name'][$i];
		
		//$upDesc->redimensiona_salva($largura_final, $path, $novo_nome);
		
		echo 'Foto #' . ($i) . ' ['.$Nome.','.$upDesc->getNomeFile().'] enviada.<br/>';		
	}
	
//- IMAGEM DE Localizacao	
	$upDesc = new upload($_FILES['imgLocaliza']);
	
	$largura_final = 100;
	$path = "thumbnails/";
	$novo_nome = "tb_local_";
	
	$upDesc->redimensiona_salva($largura_final, $path, $novo_nome);
	
	echo "<br /> Imagem de Localização: ".$upDesc->getNomeFile();	
?>

Os códigos do script da imagem da GALERIA acima, estão apenas escrevendo na tela, para testar se a imagem foi enviada ou não...

 

 

Alguem pode me dar uma ajuda com isso....

Já estou começando a entrar em desespero com esses 'bugs' que não consigo entender ainda... http://forum.imasters.com.br/public/style_emoticons/default/upset.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

resolvido retirado do topico

Compartilhar este post


Link para o post
Compartilhar em outros sites

mais uma duvida....

 

como eu faria pra dar um crop na imagem tbm... tipo:

 

na classe acima... ele redimenciona a imagem de acordo com um parametro passado pra ela antes do envio...daí no final a imagem fica proporcional.

Mas eu queria tbm, uma opção para poder dar um crop nessa imagem... (por exemplo, se eu passar 125px por parametro, a imagem deveria ser redimensionada pra ficar mais ou menos proporcional e depois aplicaria um crop nela.)

 

 

» Eh mto complicado de fazer isso???

» Alguem conhece uma meio de realizar essa proeza???

Compartilhar este post


Link para o post
Compartilhar em outros sites

ninguem saca????

 

A minha dúvida maior está 5 posts acima... isso tá matando o meu site aqui... e a pressão tá grande pra concluir isso... mas eu não faço idéia de como solucionar isso...

 

O desespero bateu!!! :huh: http://forum.imasters.com.br/public/style_emoticons/default/upset.gif http://forum.imasters.com.br/public/style_emoticons/default/cry.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

esta 5 posts porque voce nao para de floodar o forum senao estaria 1 apenas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mário,

Eu não estou tentando "floodar" nada aqui... eu só estou desesperado com esse negoço dos uploads de imagens aqui...

Não estou querendo fazer bagunça aqui naum... só preciso de ajuda!!! :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aew galera, eu estive tentando entender esse negoço até agora... mas não consegui desenrolar essa bronca!!!

 

O lance ainda está naquela parte do upload múltiplo!!!

Qdo eu tento enviar uma imagem de um campo estático, ela funciona direitinho... mas qdo eu uso os inputs dinamicos não tá pegando mais os valores... =/

 

»???«

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha aew galera... esse tópico já está bem grandinho... e creio que já expliquei todas as minhas duvidas.

Eu fiz mais uns testes nesse script, e identifiquei esse trecho... que é onde está dando o problema:

 

ARQUIVO que recebe os dados do form,

<?
	$Fotos = $_FILES['imgFotos'];
	$upFotos = new upload($Fotos['name']);
	
	//- THUMBS
	$largura_final_tb = 60;
	$path_tb = "thumbnails/";
	$novo_nomeThumb = "tb_fotos_";
	//- LARGE
	$largura_final_lg = 1024;
	$path_lg = "large/";
	$novo_nomeLarge = "lg_fotos_";
	
	echo "<br /> <div style=\" display:block; background:#acd; width:100%;\">Imagem da Galeria: ";
	
	for($i = 0; $i < count($Fotos['name']); $i++)
	{
		// Passa valores da iteração atual
		$Nome	= $Fotos['name'][$i];
		$Tamanho = $Fotos['size'][$i];
		$Tipo	= $Fotos['type'][$i];
		$Tmpname = $Fotos['tmp_name'][$i];			
			
		$upFotos = new upload($Nome);
		$upFotos->createThumb($largura_final_tb, $path_tb, $novo_nomeThumb);
		$upFotos->createLarge($largura_final_lg, $path_lg, $novo_nomeLarge);
		
		echo "<br /> Imagem #: ".$i.' ['.$Nome.'],'.$upFotos->getNomeThumb();
		echo "<br /> Imagem #: ".$i.' ['.$Nome.'],'.$upFotos->getNomeLarge();
		
	}
	echo "</div>";
?>

Neste outro trecho, ele funciona direitinho:

 

//- IMAGEM DE DESCRICAO	
	$upDesc = new upload($_FILES['imgDesc']);
	//- THUMBS
	$largura_final_tb = 100;
	$path_tb = "thumbnails/";
	$novo_nomeThumb = "tb_desc_";
	//- LARGE
	$largura_final_lg = 1024;
	$path_lg = "large/";
	$novo_nomeLarge = "lg_desc_";
	
	$upDesc->createThumb($largura_final_tb, $path_tb, $novo_nomeThumb);
	$upDesc->createLarge($largura_final_lg, $path_lg, $novo_nomeLarge);
	
	echo "<br /> Imagem de Descrição: ".$upDesc->getNomeThumb();
	echo "<br /> Imagem de Descrição: ".$upDesc->getNomeLarge();

Todos os outros códigos estão nos posts mais acima... eu fiz apenas uma modificação na classe e modifiquei o nome da função redimensiona_salva(), para createThumb() e createLarge()... só alterando alguns nomes... mas a lógica e estrutura eh a mesma!!

 

 

» Fico grato se alguem puder me ajudar a identificar esse problema !!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.