Ir para conteúdo

POWERED BY:

Arquivado

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

Beto Lima

erro com uploads multiplos

Recommended Posts

Pessoal estou com um problema no envio de imagens por uploads multiplos...

Não sei o que é, pode ser um problema no array ou em algum laço. O fato é que não consegui resolver....

 

No mysql ele insere as fotos (imagen original e thumb da mesma)

 

 

INSERT INTO `galeria` (`id`, `grande`, `pequena`, `album`, `descricao`) VALUES

(231, 'imagem_1222441116.jpg', 'thumb_1222441116.jpg', '1', 'descrição da foto'),

(232, 'imagem_1222441117.jpg', 'thumb_1222441117.jpg', '2', 'descrição da foto'),

(233, 'imagem_1222441118.jpg', 'thumb_1222441118.jpg', '3', 'descrição da foto'),

(234, 'imagem_1222441118.jpg', 'thumb_1222441118.jpg', '2', 'descrição da foto'),

(235, 'imagem_1222441119.jpg', 'thumb_1222441119.jpg', '1', 'descrição da foto');

 

Essas inserções eu fiz pelo form com upload multiplo, note que os ids 233 e 234 possuem o mesmo nome de imagem e thumb.

 

E é esse o problema que ta pegando, as vezes eles se duplicam nos primeiros ids e outras nos ids finais...

 

Se alguém puder me ajudar agradeço.

vou postar meu cód abaixo:

 

index.php

<?php
		
require_once ("class_upload.php");
$upload = new Upload();
$file=isset($_FILES['arquivo']) ? $_FILES['arquivo']['tmp_name'] : FALSE;
if($file!=FALSE){
	$cn=count($file);
	for($i=0;$i<$cn;$i++){
		if($file[$i]{1}){
			$upload->Envia_Arquivo("$i");
		} 
	}
}

?>
<html>
<head>
<title>Upload de imagens</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<table align="center" width="100%" cellpadding="0" cellspacing="0" border="0">
	<tr>
		<td align="left">
<form action="index.php" method="post" enctype="multipart/form-data" name="form1" id="form1">
  <input name="arquivo[]" type="file" id="arquivo[]" /><br>
  <textarea name="descricao[]" rows="2" id="descricao[]"></textarea><br><br>
  <input name="arquivo[]" type="file" id="arquivo[]" /><br>
  <textarea name="descricao[]" rows="2" id="descricao[]"></textarea><br><br>
  <input name="arquivo[]" type="file" id="arquivo[]" /><br>
  <textarea name="descricao[]" rows="2" id="descricao[]"></textarea><br><br>
  <input name="arquivo[]" type="file" id="arquivo[]" /><br>
  <textarea name="descricao[]" rows="2" id="descricao[]"></textarea><br><br>
  <input name="arquivo[]" type="file" id="arquivo[]" /><br>
  <textarea name="descricao[]" rows="2" id="descricao[]"></textarea><br><br>
  <br>
  <label>Selecione o Album
  <select name="seleciona_album" id="seleciona_album">
  <option>Selecione</option>
  <?php 
	$q = "SELECT * FROM album ORDER BY id ASC";
	$d = mysql_query($q);
	while($r = mysql_fetch_array($d))
		echo '<option value="'.$r['id'].'">'.$r['album'].'</option>';
	?>
  </select>
  </label>
  <input type="submit" name="Submit" value="Enviar">
</form>
		</td>
	</tr>
</table>
</body>
</html>

class_upload.php

 

<?php
$_host = "localhost";
$_user = "root"; // usuário
$_pass = ""; // senha
$_db = "galeria"; // banco de dados

mysql_pconnect($_host, $_user, $_pass) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_select_db($_db);

?>
<?php
	set_time_limit(0);
	include "funcoes.php";
	

	class Upload {
		var $arquivo = "";
		var $erro = array ( "0" => "<script language=javascript>window.alert('\"Foto Enviada com sucesso!\"')
</script>",
						"1" => "<script language=javascript>window.alert('\"O arquivo é maior que o permitido pelo Servidor!\"')
</script>", 
						"2" => "<script language=javascript>window.alert('\"O arquivo é maior que o permitido pelo formulario!\"')
</script>",
						"3" => "<script language=javascript>window.alert('\"O upload do arquivo foi feito parcialmente!\"')
</script>", 
						"4" =>"<script language=javascript>window.alert('\"Não foi feito o upload do Arquivo!\"')
</script>");
		
		function Verifica_Upload($z="0") {
			$this->arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : FALSE;
			if(!is_uploaded_file($this->arquivo['tmp_name'][$z])) {
				return false;
			}
			$get = getimagesize($this->arquivo['tmp_name'][$z]);
			
			if(($get["mime"] != "image/jpeg") AND ($get["mime"] != "image/gif") AND ($get["mime"] != "image/png")) {
				echo "<span style=\"color: white; border: solid 1px; background: red;\">Esse arquivo nao é uma imagem válida</span>";
				exit;
			}
			return true;
		}
		
		function Envia_Arquivo($z="0") {
			if($this->Verifica_Upload($z)) {
				$this->gera_fotos($z);
				return true;
				} else {
					echo "<span style=\"color: white; border: solid 1px; background: red;\">".$this->erro[$this->arquivo['error']]."</span>";
			}
		}
		
		function gera_fotos($z="0") {
			$diretorio = "images/";
			$diretorio_g = "images/big/";
			$diretorio_p = "images/small/";
			if(!file_exists($diretorio)) {
				mkdir($diretorio);
			}
			if(!file_exists($diretorio_g)) {
				mkdir($diretorio_g);
			}
			if(!file_exists($diretorio_p)) {
				mkdir($diretorio_p);
			}
			
			$get2 = getimagesize($this->arquivo['tmp_name'][$z]); /* Vai servir para verificar se eh GIF ou JPG ou PNG*/
			$aux_tipo_imagem = $get2["mime"]; /* Vai servir para verificar se eh GIF ou JPG ou PNG*/
			
			if ($aux_tipo_imagem == "image/jpeg") {
				$nome_foto  = "imagem_".time().".jpg";
				$nome_thumb = "thumb_".time().".jpg";
				//determino uma resolução maxima e se a imagem for maior ela sera reduzida
				reduz_imagem_jpg($this->arquivo['tmp_name'][$z], 500, 400, $diretorio_g.$nome_foto);
				//passo o tamanho da thumbnail
				reduz_imagem_jpg($this->arquivo['tmp_name'][$z], 150, 150, $diretorio_p.$nome_thumb);
			}
			
			if ($aux_tipo_imagem == "image/gif") {
				$nome_foto  = "imagem_".time().".gif";
				$nome_thumb = "thumb_".time().".gif";
				//determino uma resolução maxima e se a imagem for maior ela sera reduzida
				reduz_imagem_gif($this->arquivo['tmp_name'][$z], 500, 400, $diretorio_g.$nome_foto);
				//passo o tamanho da thumbnail
				reduz_imagem_gif($this->arquivo['tmp_name'][$z], 150, 150, $diretorio_p.$nome_thumb);
			}
			
			if ($aux_tipo_imagem == "image/png") {
				$nome_foto  = "imagem_".time().".png";
				$nome_thumb = "thumb_".time().".png";
				//determino uma resolução maxima e se a imagem for maior ela sera reduzida
				reduz_imagem_png($this->arquivo['tmp_name'][$z], 500, 400, $diretorio_g.$nome_foto);
				//passo o tamanho da thumbnail
				reduz_imagem_png($this->arquivo['tmp_name'][$z], 150, 150, $diretorio_p.$nome_thumb);
			}
			
			echo "<span style=\"color: white; border: solid 1px; background: purple;\">".$this->erro[$this->arquivo['error'][$z]]."</span>";
			
			$descricao=	$_POST['descricao'][$z];
			
			// Isso aqui faz gravar o nome do arquivo no banco de dados, lembrando que você deve fazer a conexao antes... :D
			mysql_query("INSERT INTO galeria SET grande='$nome_foto', pequena='$nome_thumb', descricao='$descricao', album='".$_POST['seleciona_album']."'"); 
			
		}
	}
?>

 

e por último o arquivo funcoes.php

 

 

<?php
//########################  Função para imagem JPG ###########################

	function reduz_imagem_jpg($img, $max_x, $max_y, $nome_foto) {
		
		//pega o tamanho da imagem ($original_x, $original_y)
		list($width, $height) = getimagesize($img);
		
		$original_x = $width;
		$original_y = $height;
		
		// se a largura for maior que altura
		if($original_x > $original_y) {
			$porcentagem = (100 * $max_x) / $original_x;
			} else {
				$porcentagem = (100 * $max_y) / $original_y;
		}
		
		$tamanho_x = $original_x * ($porcentagem / 100);
		$tamanho_y = $original_y * ($porcentagem / 100);
		
		$image_p = imagecreatetruecolor($tamanho_x, $tamanho_y);
		$image   = imagecreatefromjpeg($img);
		
		imagecopyresampled($image_p, $image, 0, 0, 0, 0, $tamanho_x, $tamanho_y, $width, $height);
		
		return imagejpeg($image_p, $nome_foto, 70);
	}
	

//########################  Função para imagem GIF ###########################
	
	function reduz_imagem_gif($img, $max_x, $max_y, $nome_foto) {
		
		//pega o tamanho da imagem ($original_x, $original_y)
		list($width, $height) = getimagesize($img);
		
		$original_x = $width;
		$original_y = $height;
		
		// se a largura for maior que altura
		if($original_x > $original_y) {
			$porcentagem = (100 * $max_x) / $original_x;
			} else {
				$porcentagem = (100 * $max_y) / $original_y;
		}
		
		$tamanho_x = $original_x * ($porcentagem / 100);
		$tamanho_y = $original_y * ($porcentagem / 100);
		
		$image_p = imagecreatetruecolor($tamanho_x, $tamanho_y);
		$image   = imagecreatefromgif($img);
		
		imagecopyresampled($image_p, $image, 0, 0, 0, 0, $tamanho_x, $tamanho_y, $width, $height);
		
		return imagegif($image_p, $nome_foto, 70);
	}
	
	

//########################  Função para imagem PNG ###########################
	
	 function reduz_imagem_png($img, $max_x, $max_y, $nome_foto) {
		
		//pega o tamanho da imagem ($original_x, $original_y)
		list($width, $height) = getimagesize($img);
		
		$original_x = $width;
		$original_y = $height;
		
		// se a largura for maior que altura
		if($original_x > $original_y) {
			$porcentagem = (100 * $max_x) / $original_x;
			} else {
				$porcentagem = (100 * $max_y) / $original_y;
		}
		
		$tamanho_x = $original_x * ($porcentagem / 100);
		$tamanho_y = $original_y * ($porcentagem / 100);
		
		$image_p = imagecreatetruecolor($tamanho_x, $tamanho_y);
		$image   = imagecreatefrompng($img);
		
		imagecopyresampled($image_p, $image, 0, 0, 0, 0, $tamanho_x, $tamanho_y, $width, $height);
		
		return imagepng($image_p, $nome_foto, 70);
	}
?>

as tabelas aqui:

CREATE TABLE `album` (
  `id` int(10) NOT NULL auto_increment,
  `album` varchar(60) NOT NULL,
  `capa` varchar(100) default NULL,
  `mostra` varchar(3) NOT NULL,
  `data_criacao` date NOT NULL,
  `taime` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13;

-- 
-- Extraindo dados da tabela `album`
-- 

INSERT INTO `album` (`id`, `album`, `capa`, `mostra`, `data_criacao`, `taime`) VALUES 
(1, 'album1', 'thumb_1222476832.jpg', '2', '2008-10-05', '2008-10-10 18:00:44');

-- --------------------------------------------------------

-- 
-- Estrutura da tabela `galeria`
-- 

CREATE TABLE `galeria` (
  `id` int(10) NOT NULL auto_increment,
  `grande` varchar(100) NOT NULL,
  `pequena` varchar(100) NOT NULL,
  `album` varchar(450) NOT NULL,
  `descricao` varchar(50) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=267;

já populei a tabela album pra não precisar criar depois....

Compartilhar este post


Link para o post
Compartilhar em outros sites

não há problema com a coluna album, o problema deve ser o array acho eu, porque ele ta inserindo imagens com o mesmo nome em ids diferentes....é isso que ta pegando

Compartilhar este post


Link para o post
Compartilhar em outros sites

você modifica os nomes das imagens pra dar o INSERT ??

 

pelo que vi você so insere o imagem_ e thumb_, no minimo você ta fazendo o upload de 2 imagens de nomes iguais ...

 

crie uma função pra gerar uma string randomida, deve resolver ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

pode apenas concatenar ao nome a data hora do sistema ao nome original da imagem ou parte dele que nao repetirá nomes mais

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas acontece que além disso, somente é upada a imagem com último nome.

Ex: se existe duas duplicadas

 

id1 - imagem1224.jpg

id2 - imagem1224.jpg

 

ele upa a imagem do id2 no caso, insere as duas no banco mas descarta a primeira foto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

é justamente por isso que precisa renomear a todas

 

pois existe a possibilidade de serem upadas imagens diferentes com o mesmo nome

 

voce nao pode permitir que o seu sistema tenha esta falha infantil

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Mario;

 

id1 - imagem1224.jpg

id2 - imagem1224.jpg

 

já é a consulta da tabela. Os nomes originais das imagens eram outros bem diferentes....

 

Por acaso você consegue achar se existe algum erro no class.upload.php que está no post?

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

vou tentar explicar mais uma vez o que estou sugerindo e o que voce fez até o momento

 

entendi que voce ja substituiu mas mesmo assim voce correr o risco de ter nomes repetidos

 

minha sugestao é que use para o nome da imagem a concatenação do nome original ou parte dele com a data hora de insercao assim elimina a chance de ter imagens com nomes iguais

 

Exemplo

 

Imagem uppada as 20:30:12 do dia 30/09/2008 com o nome original de mario.jpg

Ficaria 20080930233012mario.jpg ou outra combinacao destes dados como 2008_09_30_20_30_12

 

Utilizei este padrao de ordem dos valores pois assim a ordm alfabetica será a mesma ordem de criacao

 

Assim mesmo que depois voce up outra imagem com o nome mario.jpg as 07:53:01 do dia 02/10/2008 os nomes nao serao repetidos pois será 20081002075301mario.jpg

 

Entende agora?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entende agora?

Ele não sei mário, mas eu entendi e estava pensando em desenvolver um código desses com upload de mais de uma imagem

 

E ta na mão olha o ctrl+c + ctrl+v http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

logico que existem outras formas como nomes randomicos e voce apenas antes de grava testa se ja nao tem outro existente

 

so nao pode deixar repetir de modo algum

Compartilhar este post


Link para o post
Compartilhar em outros sites

De nada

 

Qualquer coisa poste

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpem pessoal, mas não consegui ainda...

 

no class_upload.php tem um trecho do cód onde ele pega o nome da imagem e mescla com o time...

 

if ($aux_tipo_imagem == "image/jpeg") {
				$nome_foto  = "imagem_".time().".jpg";
				$nome_thumb = "thumb_".time().".jpg";
				//determino uma resolução maxima e se a imagem for maior ela sera reduzida
				reduz_imagem_jpg($this->arquivo['tmp_name'][$z], 500, 400, $diretorio_g.$nome_foto);
				//passo o tamanho da thumbnail
				reduz_imagem_jpg($this->arquivo['tmp_name'][$z], 150, 150, $diretorio_p.$nome_thumb);
			}

tentei alterar para:

 

 

if ($aux_tipo_imagem == "image/jpeg") {

$nome_foto = "imagem_".microtime().".jpg";

$nome_thumb = "thumb_".microtime().".jpg";

//determino uma resolução maxima e se a imagem for maior ela sera reduzida

reduz_imagem_jpg($this->arquivo['tmp_name'][$z], 500, 400, $diretorio_g.$nome_foto);

//passo o tamanho da thumbnail

reduz_imagem_jpg($this->arquivo['tmp_name'][$z], 150, 150, $diretorio_p.$nome_thumb);

}

 

Ele até gerou as 5 imagens mas dae veio outro problema, na coluna onde é salva o nome da imagem fica com nome diferente da coluna onde é salva a thumb. (isso estou falando de 1 registro).

 

Dae da pau na hora de exibir as imagens, pq a thumb não localizara a original porque estão com nomes diferentes...

 

Se pelo menos ele mantivesse o mesmo nome da coluna imagem pra coluna thumb, seria perfeito... (isso pra cada registro)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opá amigo só agora pude da uma olhada, esse programa muito rápido, fiz um teste com 5 imagens de 70 bytes cada , somente com time e gera nas nas duas colunas e nas 5 linhas o mesmo nome para as imagens

 

agora não vejo problema em colocar nomes difrentes nas imagens pois fiz o teste aqui e puxa na boa, bom eu tou puxando pelo id da imagem não sei voce :blink:

 

 

e fiz o seguinte

 

uniqid(time())

http://www.php.net/uniqid

 

sem erro

 

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

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.