0

Deletando arquivos do diretorio

criado por Rafael Santos em 08/04/2010 12:42pm
Olá, desculpa estar enchendo novamente, mas, é o seguinte, eu estou usando aquele script para listar os arquivos de um diretorio:

// listando arquivos do diretório
$contents = ftp_nlist($conn_id, $remote_dir);



// exibindo
echo '

';

foreach($contents as $file)
chmod ('$file', 0777);
echo '<a href="/ftp/usuario/download.php?arquivo=/ftp/usuario/ftp/'. (str_replace($remote_dir,"",$file)) . ' "> <br>' . (basename($file)) .' </a> <a href="/ftp/usuario/exclui.php?arquivo=/ftp/usuario/ftp/'. (str_replace($remote_dir,"",$file)) . '"> Delete </a>
';
echo '
';

tudo bem, mas, vejam que há mais um link ali, para, excluir cada arquivo quando clikado, mas, só esse arquivo...
Tipo, a minha duvida:
O que tem que ter no exclui.php para excluir o arquivo...
eu coloquei isso mas, não deu certo, ele fala que tem um erro:
<?php
if(isset($_GET['arquivo']) && is_writable($_GET['arquivo']))
{

unlink($_GET['arquivo]);
echo 'Arquivo deletado com sucesso';
}
else
{
echo 'Houve um erro ao tentar excluir o arquivo ';
} ?>

ele fala isso de haver um erro...
Eu pensei em colocar o Unlink na propria pagina que lista, mas, ai, ele apagaria todos os arquivos...
Alguém sabe onde esta o problema?

E tipo, eu também gostaria que listasse o tamanho do arquivo...
isso é possivel?
E eu tbm queria uma barra de progresso no sistema de upload que eu tenho, mas, eu preciso primeiramente disso de deletar e de mostrar o tamanho do arquivo...
agradeço desde já.

Lista de Respostas:

+2
08/04/2010 2:04pm
(~14 anos atrás)
Marcos Regis respondeu:
Rafael, se o arquivo está no FTP você não pode usar unlink. Tudo que for fazer no diretório FTP tem que ser feito com funções de FTP.

ftp_delete();

Outra coisa, lembor de já ter mencionado isso e vou repetir: Nunca coloque o caminho completo do arquivo em urls. Isso é uma brecha de segurança.

NOTA: Não entendi também porque sua url está no formato /ftp/usuario..

Segue código de delete
$ftp
if(isset($_GET['arquivo']))
{
. . try
. . {
. . . . // Conecte ao ftp 
. . . . ftp_delete($conn,$_GET['arquivo']);
. . . . echo "Arquivo removido com sucesso!";
. . }
. . catch(Exception $e)
. . {
. .   echo 'Houve um erro ao tentar excluir o arquivo!';
. . }
}
else
{
. . echo 'Houve um erro ao tentar excluir o arquivo ';
}

+1
08/04/2010 2:45pm
(~14 anos atrás)
Marcos Regis respondeu:
Há um erro de sintaxe logo no início

<div class="code"><pre class="prettyprint"><?php $ftp
if(isset($_GET['arquivo']))
{

remove aquele $ftp solto logo após a abertura da tag <?php

+1
08/04/2010 4:05pm
(~14 anos atrás)
Marcos Regis respondeu:
possivelmente é a permissão.
O código precisa ser melhorado para dar fidelidade ao ato
segue uma possibilidade
... // Seu
if(ftp_delete($conn_id,$_GET['arquivo']))
  echo "Arquivo removido com sucesso!";
else
  echo "Erro ao tentar remover o arquivo";
... //

Dê permissão 0666 ou 0777 nos arquivos do FTP para que seja possivel excluí-lo.

0
08/04/2010 2:16pm
(~14 anos atrás)
Rafael Santos respondeu:
então, esse foi o jeito que consegui fazer, pq tipo, se o download.php estivesse na mesma pasta que pede para listar
ele também seria listado e isso não daria certo
então, eu coloquei ele em uma pasta anterior e, quando clikava, abria o link que estava na pasta de listagem...

então, esse codigo ai tah dando erro...
na parte //conecte eu mandei conectar e mudei o $conn para $conn_id que é como esta a conexão, mas, quando cliko no link lah em "delete", ele me manda para uma pagina totalmente em branco...

0
08/04/2010 2:31pm
(~14 anos atrás)
Marcos Regis respondeu:
Página em branco significa erro de parser no arquivo PHP.
Removeu os pontos do código? Só estão ali para facilitar a identação.

0
08/04/2010 2:37pm
(~14 anos atrás)
Rafael Santos respondeu:
removi sim
tah assim:

<div class="code"><pre class="prettyprint"><?php $ftp
if(isset($_GET['arquivo']))
{
try
{
$remote_dir='webroot/ftp/usuario/ftp/'; // Caminho para o diretório remoto
$ftp_server = 'meudominio.com.br'; // FTP do destino
$ftp_user_name = 'usuario';
$ftp_user_pass = 'senha';


// Conexão
$conn_id = ftp_connect($ftp_server);

// login
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

ftp_delete($conn_id,$_GET['arquivo']);
echo "Arquivo removido com sucesso!";
}
catch(Exception $e)
{
echo 'Houve um erro ao tentar excluir o arquivo!';
}
}
else
{
echo 'Houve um erro ao tentar excluir o arquivo ';
} ?>
</pre></div>

0
08/04/2010 2:55pm
(~14 anos atrás)
Rafael Santos respondeu:
tah, agora, eu cliko e ele fala o seguinte:
"Arquivo removido com sucesso!"

mas, quando eu vou ver, ele não foi excluido, continua lah...

Ps: caso tenha acontecido com mais alguem, estava listando somente o ultimo arquivo...
eu tirei o Chmod do codigo e agora lista todos...
ps2: ele num excluia nem antes de eu tirar o chmod

0
08/04/2010 4:12pm
(~14 anos atrás)
Rafael Santos respondeu:
mas, se tivesse com erro na permissão, ele não teria que dar o erro?
senão tem nada haver, onde eu poderia mudar a perissão do arquivo?
pq, eu tentei colocar em varios lugares e, todos eles ou não adiantavam ou dava o erro de aparecer apenas um arquivo na listagem...


eu acho que , o problema é que o codigo não esta vendo o 'arquivo' como o arquivo certo para ser deletado, isso pode acontecer?
pq tipo, ele fala que o arquivo foi deletado com sucesso, não pode ser que ele esteja vendo o 'arquivo' como algo diferente do que eu quero?

0
09/04/2010 11:56am
(~14 anos atrás)
Marcos Regis respondeu:
printa o nome do arquivo que está sendo enviado. Pode ser que esteja com algum problema. Evite espaços no nome pois eles serão formatados com %20 para que sejam enviados corretamente na url. Se for esse o caso trate os dados com a função urldecode().

Para ver o que exatamente está no FTP inclusive com as permissões use este codigo
// get the file list for /
$buff = ftp_rawlist($conn_id, '/');

// close the connection
ftp_close($conn_id);

// output the buffer
var_dump($buff);


0
09/04/2010 12:14pm
(~14 anos atrás)
Rafael Santos respondeu:
eu printei assim:
mostrei que era:

$remote_dir='webroot/ftp/usuario/ftp/'; // Caminho para o diretório remoto
$ftp_server = 'dominio.net.br'; // FTP do destino
$ftp_user_name = 'usuario';
$ftp_user_pass = 'senha';
$file = 'arquivo';

e, na hora de dar o echo, coloquei assim

echo ' '. $file .' removido com sucesso! ';

ai, ele aparece assim quando eu mando deletar
"arquivo removido com sucesso!"

é isso mesmo?

e, isso ai, eu coloquei lah e ele apareceu uma data, acho que de criação do dominio
e tbm aparece 'webroot'

0
09/04/2010 3:37pm
(~14 anos atrás)
Rafael Santos respondeu:
tudo bem, vamos lah
eu fiz o seguinte:

if($file = $_GET['arquivo'])
{
try
{
$remote_dir='webroot/ftp/usuario/ftp/'; // Caminho para o diretório remoto
$ftp_server = 'dominio.net.br'; // FTP do destino
$ftp_user_name = 'usuario';
$ftp_user_pass = 'senha';





// Conexão
$conn_id = ftp_connect($ftp_server);

// login
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);


ftp_delete($conn_id,$_GET[$file]);
echo ' '. $file .' removido com sucesso! ';
}
catch(Exception $e)
{
echo 'Houve um erro ao tentar excluir o '. $file .'';
}
}
else
{
echo 'Houve um erro ao tentar excluir o '. $file .' ';
} ?>

no link da pagina que lista esta assim:
<a href="/ftp/teste/exclui.php?arquivo='

quando eu cliko pra deletar, fala assim:
'guia_pais_2010_capa_web.jpg removido com sucesso!'

estaria otimo, mas, quando eu volto, ele AINDA esta lah...
sera que são as permissões que tipo, eu acho dificil jah que ele fala que foi removido com sucesso...

0
09/04/2010 4:13pm
(~14 anos atrás)
Marcos Regis respondeu:
Cara. tá cheirando a permissão. E outra coisa. Você não mudou o comando do delete para o que eu te passei. Coloque o ftp_delete dentro de um condicional pois ele retornará true ou false.
Se mesmo assim continuar dando "sucesso" tente usar o comando direto no FTP

if(ftp_exec($conn_id,'rm ' . $file))
  echo 'O arquivo '. $file .' foi removido com sucesso! ';
else
  echo ' Falha ao remover o arquivo '. $file;


0
09/04/2010 4:19pm
(~14 anos atrás)
Rafael Santos respondeu:
então, eu fiz isso e ele da a tela branca denovo
fico assim tudo que da a tela branca

<?php
if($file = $_GET['arquivo'])
{
try
{
$remote_dir='webroot/ftp/usuario/ftp/'; // Caminho para o diretório remoto
$ftp_server = 'dominio.net.br'; // FTP do destino
$ftp_user_name = 'usuario';
$ftp_user_pass = 'usuario';





// Conexão
$conn_id = ftp_connect($ftp_server);

// login
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
chmod ('/webroot/ftp/usuario/ftp/'. $file . '', 0777);

if (ftp_delete($conn_id, $_GET['arquivo')) {
echo "Arquivo removido com sucesso!";
} else {
echo "Erro ao tentar remover o arquivo";
}
?>

0
09/04/2010 4:22pm
(~14 anos atrás)
Rafael Santos respondeu:
Ps, eu vi agora e adicionei os dois '}' no final do codigo, ainda da a tela branca

0
09/04/2010 4:50pm
(~14 anos atrás)
Rafael Santos respondeu:
ok, arrumei

<?php
if($file = $_GET['arquivo'])
{
$remote_dir='webroot/ftp/usuario/ftp/'; // Caminho para o diretório remoto
$ftp_server = 'dominio.net.br'; // FTP do destino
$ftp_user_name = 'usuario';
$ftp_user_pass = 'usuario';}






// Conexão
$conn_id = ftp_connect($ftp_server);

// login
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
chmod ('/webroot/ftp/usuario/ftp/'. $file . '', 0777);

if (ftp_delete($conn_id, $_GET['arquivo'])) {
echo "Arquivo removido com sucesso!";
} else {
echo "Erro ao tentar remover o arquivo";
}
?>

ele da o erro mesmo, 'Erro ao tentar remover o arquivo'
Deve ser permissões mesmo
mas, o chmod só pega em linux
e agora?

0
09/04/2010 6:34pm
(~14 anos atrás)
Marcos Regis respondeu:
Como mencionei antes, pelo FTP apenas use funções de FTP.

Use ftp_chmod e não chmod.

Se o arquivo é criado pelo PHP com as funções de ftp, deveria ser possível removê-lo sem problemas.

0
12/04/2010 12:04pm
(~14 anos atrás)
Rafael Santos respondeu:
então, é por isso que eu achei estranho
eu faço o upload e, quando coloco pra deletar, ele diz que houve um erro
pra mandar pro ftp eu uso o ftp_put

(ftp_put($conn_id,$filename,$_FILES['userfiles']['tmp_name'][$x],FTP_BINARY)){

e o de exclui esta ai em cima, e o de listar eesta lah em cima, o que será que pode ser?
eu acho qe é erro no de exclui.php...

0
12/04/2010 12:25pm
(~14 anos atrás)
Rafael Santos respondeu:
o chmod tbm da erro

if (ftp_chmod($conn_id, 0777, $file) !== false) {
echo "Fotam mudadas as permissões do arquivo $file para 777\n";
} else {
echo "não foi possível usar o chmod no arquivo $file\n";
}

O que escreve

"não foi possível usar o chmod no arquivo Myriad Roman.ttf"

0
12/04/2010 12:52pm
(~14 anos atrás)
Rafael Santos respondeu:
ok, consegui
eu fiz o seguinte

if (ftp_delete($conn_id, "webroot/ftp/teste/ftp/".$file)) {
echo 'Arquivo removido com sucesso!';
} else {
echo 'Erro ao tentar remover ' . $file . '';
}
?>

e deu certo, ele apaga direito o diretorio
muito obrigado pela ajuda Marcos quanto à isso e uanto a tudo que eu tenho pedido aki
Agora, só falta mais uma coisa, que é o de mostrar o tamanha do arquivo...
só isso, tipo, nomedoarquivo.jpg (100 kb)
ai eu (tento) parar de encher hehe

0
12/04/2010 2:05pm
(~14 anos atrás)
Marcos Regis respondeu:
o tamanho tem duas forma de fazer. Uma é fazer com que essa informação já venha do ftp usando a função ftp_rawlist(). A outra é ler o arquivo e usar strlen().
Tem ainda a possibilidade de enviar o comando de ls para retornar o tamanho de um arquivo indicado.

Escolha a que melhor lhe atenda.

0
12/04/2010 2:33pm
(~14 anos atrás)
Rafael Santos respondeu:
Pesquisei sobre o Streln() e fala que ele lista o numero de caracteres em uma determinada string...
Ls?
O ftp_rawlist é uma boa, porque tipo, ele mostra dia, data e hora neh
mas, do jeito que ele mostra, num fica legal, alem de que teria erro em deletar ou em fazer download por causa do espaço
eu vi esse ftp_size
seria uma boa neh
mas, aki comigo ele num lista nada

0
12/04/2010 2:38pm
(~14 anos atrás)
Rafael Santos respondeu:
Usei o ftp_size e ele pegou,

Myriad Roman.ttf 63784
Eu vou tentar deixar mais bonitinho, mas, o que eu precisava consegui
muito obrigado Marcos
até mais

0
12/04/2010 2:48pm
(~14 anos atrás)
Marcos Regis respondeu:
Viajei em algum momento enquanto digitava. O correto era para justamente usar ftp_size().
O problema com ftp_size é que dever ser executado para cada arquivo enquanto com ftp_rawlist já vem tudo de uma vez e basta ter uma função de tratamento desse retorno.

Um simples slipt("/[\s\t]+",$texto) deve resolver. O nome do arquivo seria o último item do vetor retornado.

0
12/04/2010 2:54pm
(~14 anos atrás)
Rafael Santos respondeu:
nossa
parece que nunca acaba isso
deu um erro
kkk
eu coloquei assim

"// exibindo
echo '

';
foreach($contents as $file);
$res = ftp_size($conn_id, $file);
$resbyte = ( $res / 1000);
echo '<a href="/ftp/teste/download.asp?arquivo=/ftp/teste/ftp/'. (str_replace($remote_dir,"",$file)) . ' "> <br>' . (basename($file,$res)) .' </a> Tamanho do arquivo: ' . $resbyte . ' <a href="/ftp/teste/exclui.php?arquivo='. (str_replace($remote_dir,"",$file)) . '"> <img src="../../imagem/delete.png" border="0"/> </a>
';
echo '
';
"


porque eu fiz assim
o $file só é definido no foreach
então, eles teriam que estar entre o foreach e o link
só que, desse modo
ele só lista o ultimo arquivo colocado na pasta...
se eu coloco o foreach antes do echo
é a mesma coisa
e tipo, eu precisava que ele exibisse todos os arquivos entende?
iso jah tinha acontecido antes mas, eu tinha descoberto outro jeito e, acabei nem tentando mais

0
12/04/2010 3:11pm
(~14 anos atrás)
Rafael Santos respondeu:
eu descobri onde esta o problema
se colocar ';' depois do foreach le lista somente um
mas, se for colocar mais alguma coisa depois do foreach, precisa ter o ';'
Oo

0
12/04/2010 3:24pm
(~14 anos atrás)
Rafael Santos respondeu:
agora foi
"
foreach($contents as $file)
$res = ftp_size($conn_id, $file);
$reskb = ( $res / 1024);


// exibindo
echo '

';
foreach($contents as $file)
echo '<a href="/ftp/teste/download.asp?arquivo=/ftp/teste/ftp/'. (str_replace($remote_dir,"",$file)) . ' "> <br>' . (basename($file,$res)) .' </a> ' . $reskb . ' <a href="/ftp/teste/exclui.php?arquivo='. (str_replace($remote_dir,"",$file)) . '"> <img src="../../imagem/delete.png" border="0"/> </a>
';
echo '"

num sei como mas deu certo
vlw e agora fecho

0
12/04/2010 9:54pm
(~14 anos atrás)
Marcos Regis respondeu:
vocÊ não está delimitando corretamente o foreach.

use as chaves para isso ou use o modo de rótulo

ex.:
foreach($vetor as $indice=>$valor)
{
  // faz algo
}

// ou

foreach($vetor as $indice=>$valor):
 // faz algo
endforeach;

Nesse código
foreach($contents as $file)
$res = ftp_size($conn_id, $file);
$reskb = ( $res / 1024);

somente o último item de $contents estará em $reskb;

o código correto deveria ser algo assim
foreach($contents as $file)
{
  $reskb = ( ftp_size($conn_id, $file)/ 1024);

  echo '<a href="/ftp/teste/download.asp?arquivo=/ftp/teste/ftp/' . 
    (str_replace($remote_dir,"",$file)) . '"> <br />' .
    (basename($file)) .' </a> ' . $reskb . 
    '<a href="/ftp/teste/exclui.php?arquivo=' . 
    (str_replace($remote_dir,"",$file)) . '"> <img src="../../imagem/delete.png" border="0"/> </a>';


0
12/04/2010 9:56pm
(~14 anos atrás)
Marcos Regis respondeu:
O faltou uma linha no código
foreach($contents as $file)
{
  $reskb = ( ftp_size($conn_id, $file)/ 1024);

  echo '<a href="/ftp/teste/download.asp?arquivo=/ftp/teste/ftp/' . 
    (str_replace($remote_dir,"",$file)) . '"> <br />' .
    (basename($file)) .' </a> ' . $reskb . 
    '<a href="/ftp/teste/exclui.php?arquivo=' . 
    (str_replace($remote_dir,"",$file)) . 
    '"> <img src="../../imagem/delete.png" border="0"/> </a>';
}

0
13/04/2010 12:48pm
(~14 anos atrás)
Rafael Santos respondeu:
é, eu percebi que tinha dado o problema e tinha feito desse jeito, só esqueci de colocar aki
eu tinha feito o "=>" tbm, mas, sem funciona tbm, só que, eu coloquei, ao invez de dividir por 1024 eu dividi por 1000
por que tipo, se vc coloca 1024 ele não da o numero certinho do arquivo como esta no programa de ftp
se vc coloca dividido por 1000
com 1024 : 73.9970703125
com 1000 : 75.773

tamanho do arquivo mostrado no programa = 75.773

é isso ai, espero que ajude quem precisar, vlw

Nova Resposta:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)