Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

diokhan

verificar se ficheiro ja existe

Recommended Posts

diokhan

boas, eu no meu projecto em php tenho um upload de ficheiros e preciso verificar se o ficheiro já existe, ate aqui tudo certo e a funcionar, mas agora preciso de verificar se o ficheiro já existe e se já existir perguntar ao utilizador se desejar actualizar o ficheiro existente e se actualizar dar mensagem a dizer que foi actualizado, senão sai e diz que o ficheiro já existe e não foi actualizado.

sei que é uma validação com javascript, penso eu 🤔


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
yoda

Fazes o upload normal, e guardas o ficheiro com uma extensão tipo .tmp no fim, ou algo parecido criado por ti, só de exemplo, e no valor de retorno do upload trazes a verificação que precisas, e lês no javascript o que vem do php. Se fizeres tudo bem no php, ele retornará a informação a dizer que o ficheiro ja existe. A partir daí, abres um modal ou algo parecido a perguntar se o user que alterar o ficheiro ou não. Se quiser, fazes um request normal em ajax para que o php apague o ficheiro existente e meta la o que foi feito upload, tirando a extensão temporária, se disser não fazes um request normal em ajax na mesma mas apagas o ficheiro temporário.

Não é o melhor, mas serve.

Share this post


Link to post
Share on other sites
diokhan

e há mais alguma solução possível? melhor ou mais eficaz? 🤔


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
KiNgPiTo

Só uma ideia rápida:

<?php

if ( file_exists("oteuficheiro.txt") ){

echo '

<script type="text/javascript">

	if ( confirm("O ficheiro existe. Substituir?") ){

		// Metes aqui a abrir o endereço php com ajax ou não que substitui o ficheiro
		alert("Vai substituir aqui...");

	}

</script>

';

}else{
echo 'ok, nao existe faz o que quiseres...';
}

?>

Share this post


Link to post
Share on other sites
diokhan

desde já obrigado pela dica, eu peguei no teu código e fiz isto:

if (file_exists($target.$_FILES["file"]["name"]))
{
echo'<script type="text/javascript">';
	if ( confirm("File already exist!<br>Overwrite?") )
	{
		if(copy($_FILES['uploaded']['tmp_name'], $target)){
			$erro = 1; // Success
			header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
		}else{
			$erro = -1; // Error
			header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
		}
		$return = 1;
	}
echo'</script>';
}else{
$erro = 2; // File already exist
header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}

mas ao fazer o upload, sou enviado para a pagina upload.php e fica tudo em branco, não me aparece a janela de confirmação 🤔


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
yoda

Não é nada disso :P

Convém fazer tudo na mesma página.

Quando disse que "não era o melhor" é porque assim fazias o upload e só depois vias que já existia o ficheiro, quando era melhor ele verificar logo "à cabeça" se ja existia ou não, mas é complicado fazer isso, para não dizer que não dá.

Share this post


Link to post
Share on other sites
diokhan

e como posso fazer então? de alguma forma eficaz? eu já estou sem ideias, nem sei por onde começar a pensar neste momento :P


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

podes explicar melhor a ideia por favor? que eu baralhei-me um pouco com a ideia :P


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
KiNgPiTo

Pegando na maneira que disse irias ter de utilizar ajax ou redireccionar para um outro script levando como parâmetros os nomes dos ficheiros a substituir... não o podes fazer assim pois tens o código php no meio de um script js...

Share this post


Link to post
Share on other sites
diokhan

ok, acho que já percebi a ideia obrigado, amanha já vou tentar resolver isto no trabalho :P


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

boas,

tentei fazer assim mas não funcionou muito bem:

<script type="text/javascript">
confirm("File already exist! Overwrite?");
//var nameProject = <?=$row[NAME_PROJECT]?>;
//var idProject = <?=$row[iD_PROJECT]?>;
if ( confirm )
{
	window.location = "./../../upload2.php?nameProj="+nameProject+"&id="+idProject;
}
</script>

estou a fazer mal? 🤔

PS: se deixar comentada as linhas que declaro as variáveis aparece a mensagem de confirmação, senão não aparece :P


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

eu primeiro faço assim:

<?php 
$path = $_GET[nameProj];
$id = $_GET[id];

$target = "upload/$path/";
mkdir("upload/$path", true);

$erro = 0;
$target = $target . basename( $_FILES['uploaded']['name']) ;

if ($_FILES['uploaded']['size'] > 350000)
{
$erro = 4; // File too large
header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}
$return = 0;

if (file_exists($target.$_FILES["file"]["name"]))
{
$erro = 2; // File already exist
header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}

if ($return == 1){
if(copy($_FILES['uploaded']['tmp_name'], $target)){
	$erro = 1; // Success
	header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}else{
	$erro = -1; // Error
	header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}
}
?>

depois verifico o $erro:

if ($erro == 2){
$nameProject = $row[NAME_PROJECT];
$idProj = $row[iD_PROJECT];
?>
<script type="text/javascript" language="javascript">
var nameProject = "<?php echo $nameProject; ?>";
var idProject = "<?php echo $idProj; ?>";
confirm("File already exist! Overwrite?");
if ( confirm )
{
	window.location = "upload2.php?nameProj="+nameProject+"&id="+idProject;
 }
</script>
<?php
//echo "<strong><font color=#006633>File already exist!</font></strong>";
}

se for actualizar faz isto:

<?php
$path = $_GET[nameProj];
$id = $_GET[id];

$target = "upload/$path/";
mkdir("upload/$path", true);

$erro = 0;
$target = $target . basename( $_FILES['uploaded']['name']) ;

if ($_FILES['uploaded']['size'] > 350000)
{
$erro = 4; // File too large
header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}
$return = 0;

if ($return == 1){
if(copy($_FILES['uploaded']['tmp_name'], $target)){
	$erro = 1; // Success
	header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}else{
	$erro = -1; // Error
	header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}
}
?>


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

sim, uso este:

<script type="text/javascript" src="./javascript/ajaxupload.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var button = $('#button1'), interval;
new AjaxUpload(button, {
	action: './Quality/qualityRead.php?id=<?php echo $idProject; ?>', 
	name: 'uploaded',
	onSubmit : function(file, ext){
		// change button text, when user selects file			
		button.text('Uploading');

		// If you want to allow uploading only 1 file at time, you can disable upload button
		this.disable();

		// Uploading. -> Uploading.. -> Uploading...
		interval = window.setInterval(function(){
			var text = button.text();
			if (text.length < 13){
				button.text(text + '.');					
			} else {
				button.text('Uploading');				
			}
		}, 200);
	},
	onComplete: function(file, response){
		button.text('Verify Quality');

		window.clearInterval(interval);

		// enable upload button
		this.enable();						
	}
});
});
</script>


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

podes dar uma luz? uma ajuda para começar para eu entender melhor isto por favor


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
yoda

Vocês puxam muito por nós pa .. Têm de passar mais tempo a aprender programação, porque depois passam a ser mais objectivos.

Há montes de tutoriais na net de como fazer um request em ajax, mas pronto .. É que assim acabamos por fazer o trabalho para as pessoas de graça, ao invés de ajudar com dúvidas de programação, e também tempos contas para pagar, e o tempo disponível é pouco. Pior que isso é que se não "ajudarmos" as pessoas elas deixam de cá vir.

Mas pronto ..

<script type="text/javascript" src="./javascript/ajaxupload.js"></script>
<script type="text/javascript">
        $(document).ready(function(){
        var button = $('#button1'), interval;
        new AjaxUpload(button, {
                action: './Quality/qualityRead.php?id=<?php echo $idProject; ?>',
                name: 'uploaded',
                onSubmit : function(file, ext){
                        // change button text, when user selects file                  
                        button.text('Uploading');
                                                       
                        // If you want to allow uploading only 1 file at time, you can disable upload button
                        this.disable();
                       
                        // Uploading. -> Uploading.. -> Uploading...
                        interval = window.setInterval(function(){
                                var text = button.text();
                                if (text.length < 13){
                                        button.text(text + '.');                                       
                                } else {
                                        button.text('Uploading');                              
                                }
                        }, 200);
                },
                onComplete: function(file, response){
                        button.text('Verify Quality');
                                               
                        window.clearInterval(interval);

                        // a imaginacao e amiga do programador
                        if (response == "1") // se for "1" é porque o ficheiro ja existe
                        {
                               var c = confirm("O ficheiro ja existe, deseja substituir?");
if (c== true)
{
   // request ajax para substituir os ficheiros
}
else
{
   // request ajax para apagar o ficheiro que foi recentemente feito upload
  }

                         }                       
                               
                        // enable upload button
                        this.enable();                                         
                }
        });
        });
        </script>

Share this post


Link to post
Share on other sites
diokhan

obrigado pela ajuda, eu tanto estou aqui para aprender como para ajudar os outros quando posso, eu não peço para me fazerem o trabalho, peço uma ajuda uma dica de como começar que eu vou aprender e desenvolver mais

mas desde já agradeço


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

eu fiz outra solução, deixo aqui o script:

<?php 
$path = $_GET[nameProj];
$id = $_GET[id];

$target = "upload/$path/";

// verifica se já existe a directoria
if (file_exists($uploads))
{

}else{
mkdir("upload/$nameProject", true);
}

$erro = 0;
$target = $target . basename( $_FILES['uploaded2']['name']) ;

if ($_FILES['uploaded2']['size'] > 350000)
{
$erro = 4; // File too large
header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}
$return = 0;

if (!file_exists($target.$_FILES["file"]["name"]))
{
if (copy($_FILES['uploaded2']['tmp_name'], $target))
{
	$erro = 1; // Success
	header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}else{
	$erro = -1; // Error
	header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}

}else{
if (empty($overwrite))
{
	$erro = 2; // Success
	header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}else{
                 // efectua o backup se necessario
	/*$now	= date('Y-m-d');
	$backup = $target."(backup)".$_FILES["file"]["name"];
	if (!copy($target.$_FILES["file"]["name"], $backup))
	{
		echo "<br/><b>Attempted Backup Failed!</b>\n";
	}*/
	if (copy($_FILES['uploaded2']['tmp_name'], $target.$_FILES["file"]["name"]))
	{
		$erro = 3; // Success
		header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
	}
	else
	{
		$erro = 5; // Success
		header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");	
	}
}
}
?>

e do outro lado a form:

echo"<form action='./upload.php?nameProj=$row[NAME_PROJECT]&id=$idProject' method='POST' enctype='multipart/form-data'>
						<tr>
							<td colspan=2 align=center>
							<h2 align=center>Update File:</h2>
							<input type='file' name='uploaded2'><br>
							Check this box <input autocomplete='off' type='checkbox' name='overwrite' /> to overwrite existing files.
							<br>
							<input type='submit' value='Upload file'>
							</td>
						</tr>
						<tr>
							<td colspan=2 align=center>";
								if ($erro == 0){
									// show nothing
								}elseif ($erro == -1){
									echo "<strong><font color=#006633>Error!<br>Failed to insert the file!</font></strong>";
								}elseif ($erro == 1){
									echo "<strong><font color=#006633>Success!<br>Your file was successfully added!</font></strong>";
								}elseif ($erro == 4){
									echo "<strong><font color=#006633>Your file is too large!</font></strong>";
								}elseif ($erro == 2){
									echo "<strong><font color=#006633>File already exist!</font></strong>";
								}elseif ($erro == 3){
									echo "<strong><font color=#006633>Success!<br>File updated!</font></strong>";
								}elseif ($erro == 5){
									echo "<strong><font color=#006633>Error!<br>Failed to update the file!</font></strong>";
								}
							echo"</td>
						</tr>
					</form>";

mas agradeço a ajuda dada


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

eu fiz também por outro método, em javascript, mas estou com um problema

<?php 
$path = $_GET[nameProj];
$id = $_GET[id];

$target = "upload/$path/";

if (file_exists($uploads))
{

}else{
mkdir("upload/$nameProject", true);
}

// se existe
if (file_exists($target.$_FILES['uploaded2']['name'])){
?>
<script type="text/javascript" language="javascript">
	if ( confirm ("File already exist! Overwrite?") ){
    	window.location = '?opcao=editProject&id=<?php echo $id; ?>&over=1';
	}else{
		window.location = 'restrito.php?opcao=editProject&id=<?php echo $id; ?>&erro=5';
	}
</script>
<?php

// se nao existe 
}else{

$erro = 0;
$target = $target . basename( $_FILES['uploaded2']['name']) ;

if ($_FILES['uploaded2']['size'] > 350000)
{
	$erro = 4; // File too large
	header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}
if (copy($_FILES['uploaded2']['tmp_name'], $target))
{
	$erro = 1; // Success
	header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}else{
	$erro = -1; // Error
	header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}
}

// se existe espera pela resposta do utilizador
$over = $_GET[over];
// se resposta = 1 actualiza
if ($over == 1){
$erro = 0;
$target = $target . basename( $_FILES['uploaded2']['name']) ;

if ($_FILES['uploaded2']['size'] > 350000)
{
	$erro = 4; // File too large
	header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}
if (copy($_FILES['uploaded2']['tmp_name'], $target))
{
	$erro = 1; // Success
	header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}else{
	$erro = -1; // Error
	header ("Location: restrito.php?opcao=editProject&id=$id&erro=$erro");
}
}
?>

ao fazer o upload ele verifica se o ficheiro existe, se existe pergunta se pretende actualizar, mas se digo que sim depois da-me erro ao inserir e não faz o upload, sei que o erro esta na linha em highlight, se alguém puder ajudar me a reparar isto agradeço


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites

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

×

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.