Jump to content


Photo

Sobrescrever Arquivo No Upload Caso Já Exista


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

#1 vS*

vS*

    Novato no fórum

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

Posted 14/06/2007, 16:44

Olá, gostaria de saber se alguém sabe como sobrescrever um arquivo no upload caso já exista.

script que baixei:
<?
$arquivo = isset($_FILES["foto"]) ? $_FILES["foto"] : FALSE;

$config = array();
// Tamano máximo da imagem, em bytes
$config["tamanho"] = 100028;
// Largura Máxima, em pixels
$config["largura"] = 245;
// Altura Máxima, em pixels
$config["altura"] = 101;
// Diretório onde a imagem será salva
$config["diretorio"] = "banners/";

// Gera um nome para a imagem e verifica se já não existe, caso exista, gera outro nome e assim sucessivamente..
// Função Recursiva
function nome($extensao)
{
	global $config;

	// Gera um nome único para a imagem
	$temp = banner1;
	$imagem_nome = $temp . "." . $extensao;
	
	// Verifica se o arquivo já existe, caso positivo, chama essa função novamente
	if(file_exists($config["diretorio"] . $imagem_nome))
	{
		$imagem_nome = nome($extensao);
	}

	return $imagem_nome;
}

if($arquivo)
{
	$erro = array();
	
	// Verifica o mime-type do arquivo para ver se é de imagem.
	// Caso fosse verificar a extensão do nome de arquivo, o código deveria ser:
	//
	// if(!eregi("\.(jpg|jpeg|bmp|gif|png){1}$", $arquivo["name"])) {
	//	  $erro[] = "Arquivo em formato inválido! A imagem deve ser jpg, jpeg, bmp, gif ou png. Envie outro arquivo"; }
	//
	// Mas, o que ocorre é que alguns usuários mal-intencionados, podem pegar um vírus .exe e simplesmente mudar a extensão
	// para alguma das imagens e enviar. Então, não adiantaria em nada verificar a extensão do nome do arquivo.
	if(!eregi("^image\/(pjpeg|jpeg|png|gif|bmp)$", $arquivo["type"]))
	{
		$erro[] = "Arquivo em formato inválido! A imagem deve ser jpg, jpeg, bmp, gif ou png. Envie outro arquivo";
	}
	else
	{
		// Verifica tamanho do arquivo
		if($arquivo["size"] > $config["tamanho"])
		{
			$erro[] = "Arquivo em tamanho muito grande! A imagem deve ser de no máximo " . $config["tamanho"] . " bytes. Envie outro arquivo";
		}
		
		// Para verificar as dimensões da imagem
		$tamanhos = getimagesize($arquivo["tmp_name"]);
		
		// Verifica largura
		if($tamanhos[0] > $config["largura"])
		{
			$erro[] = "Largura da imagem não deve ultrapassar " . $config["largura"] . " pixels";
		}

		// Verifica altura
		if($tamanhos[1] > $config["altura"])
		{
			$erro[] = "Altura da imagem não deve ultrapassar " . $config["altura"] . " pixels";
		}
	}

	if(!sizeof($erro))
	{
		// Pega extensão do arquivo, o indice 1 do array conterá a extensão
		preg_match("/\.(gif|bmp|png|jpg|jpeg){1}$/i", $arquivo["name"], $ext);
		
		// Gera nome único para a imagem
		$imagem_nome = nome($ext[1]);

		// Caminho de onde a imagem ficará
		$imagem_dir = $config["diretorio"] . $imagem_nome;

		// Faz o upload da imagem
		move_uploaded_file($arquivo["tmp_name"], $imagem_dir);
	}
}
?>
<html>
<head>
<title>Enviar Foto</title>
<style type="text/css">
BODY, TD {font-family: verdana; font-size: 10pt; color: black}
</style>
</head>

<body bgcolor="#FFFFFF" link="#000000" vlink="#000000" alink="#000000">

<center><font size=4>Trocar Banner</font><BR>
<?
// Imagem foi enviada com sucesso, mostra mensagem de SUCESSO
if($arquivo && !sizeof($erro))
{
	echo "<img src=\"" . $imagem_dir . "\" border=0><BR><BR>Banner enviado com sucesso!";
}

// Ocorreu algum erro ou ainda o formulário não foi postado
else
{
?>
<form action="<?echo $PHP_SELF?>" method=post  ENCTYPE="multipart/form-data">
A imagem não deve ter mais que <?echo $config["tamanho"] ?> bytes e deve ter <? echo $config["largura"] . "x" . $config["altura"] ?> pixels.<BR>
<table border=0 cellpadding=2 cellspacing=1 align=center>
<?
if(sizeof($erro))
{
	echo "<tr><td colspan=2 bgcolor=red><B><U>Ocorreu(am) o(s) seguinte(s) erro(s):</u><BR>";
	foreach($erro as $err)
	{
		echo " - " . $err . "<BR>";
	}
	echo "</B></td></tr>";
}
?>
<tr><td align=center>Enviar Banner: <input type=file size=30 name=foto></td></tr>
<tr><td align=center><input type=submit value="Enviar!"></td></tr>
</table>
</form>
<? } ?>
</body>
</html>


#2 CaRLo

CaRLo

    12 Horas

  • Usuários
  • 130 posts
  • Sexo:Masculino
  • Localidade:Pelotas/RS
  • Interesses:HTML, CSS, jQuery, PHP, MySQL, Fireworks

Posted 14/06/2007, 16:49

Faz um if usando o http://www.php.net/m...file-exists.php
caso o arquivo exista você usa o: http://www.php.net/m...tion.unlink.php
dai você upa o arquivo ;)
Hospedagem: www.HostSul.Com
Hospedagem Linux, Hospedagem Windows, Revenda de Hospedagem e Registro de domínios. Servidores EUA e BR.

"É melhor calar-se e deixar que as pessoas pensem que VOCÊ é um idiota do que falar e acabar com a dúvida."

#3 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 14/06/2007, 17:10

A função copy [ http://br.php.net/copy ], faz isso, se o arquivo existe ele será sobrescrito.
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#4 hostdesigner

hostdesigner

    Super Veterano

  • Usuários
  • 2910 posts
  • Sexo:Masculino
  • Localidade:Quirinópolis-GO
  • Interesses:Programação, Mulheres, Diversão, Mulheres, Música, Mulheres, Meu Carro, Mais mulheres, Internet, Outras Mulheres, Quase por último PAZ e por ultimo Outras Váááárias Mulheres...

Posted 14/06/2007, 19:36

A função copy() e move_uploaded_file() sobrescreve os arquivos se já existirem no mesmo diretório.

Existe um observação bem grande de vermelho na página de cada uma destas funções falando exatamente isso.

mas o que o nosso amigo seria necessário apenas remover está função ou simplesmente comenta-la assim como fiz
// Gera um nome para a imagem e verifica se já não existe, caso exista, gera outro nome e assim sucessivamente..
// Função Recursiva
function nome($extensao)
{
	global $config;

/*
	// Gera um nome único para a imagem
	$temp = banner1;
	$imagem_nome = $temp . "." . $extensao;
	
	// Verifica se o arquivo já existe, caso positivo, chama essa função novamente
	if(file_exists($config["diretorio"] . $imagem_nome))
	{
*/
		$imagem_nome = nome($extensao);
	//}
	return $imagem_nome;
}

Falopa!

Edição feita por: hostdesigner, 14/06/2007, 19:40.


#5 vS*

vS*

    Novato no fórum

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

Posted 14/06/2007, 22:05

aew hostdesigner fiz como vc falou, deixei a função como comentário, mas não deu certo,
apareceu "internal server error", mas valew por ajudar.!

#6 hostdesigner

hostdesigner

    Super Veterano

  • Usuários
  • 2910 posts
  • Sexo:Masculino
  • Localidade:Quirinópolis-GO
  • Interesses:Programação, Mulheres, Diversão, Mulheres, Música, Mulheres, Meu Carro, Mais mulheres, Internet, Outras Mulheres, Quase por último PAZ e por ultimo Outras Váááárias Mulheres...

Posted 14/06/2007, 22:15

Bom, somente para explicar direito, essa função nome() tem o objetivo de criar um nome para o arquivo de forma que o nome não se repita e com isso não seja sobrescrito o novo arquivo. Se esta função não funcionar significa que o arquivo vai ficar com o mesmo nome que ele tinha quando foi enviado.

De qualquer forma erro interno de servidor? Acho que não foi por causa da função comentada.

Falopa!

#7 vS*

vS*

    Novato no fórum

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

Posted 15/06/2007, 17:40

aew hostdesigner, utilizei a função copy() ele sobrescreveu o arquivo...
valews...
alguém sabe a função para renomear o arquivo no upload?

#8 hostdesigner

hostdesigner

    Super Veterano

  • Usuários
  • 2910 posts
  • Sexo:Masculino
  • Localidade:Quirinópolis-GO
  • Interesses:Programação, Mulheres, Diversão, Mulheres, Música, Mulheres, Meu Carro, Mais mulheres, Internet, Outras Mulheres, Quase por último PAZ e por ultimo Outras Váááárias Mulheres...

Posted 15/06/2007, 18:17

Para renomear o arquivo você pode simplesmente informar um novo nome no segundo parâmetro da função copy() ou move_uploaded_file() caso queira renomear um arquivo existente em um diretório utilize rename().

Falopa!




1 user(s) are reading this topic

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

IPB Skin By Virteq