Ir para conteúdo

Arquivado

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

Damon

Lista pasta e fazer download dos arquivos ftp

Recommended Posts

Pessoal estou precisando lista os aquivos de uma pasta no ftp ("o nome da pasta vai ser passado dinamicamente via GET").
Depois de aparecer o arquivos da determinada pasta somente dela, o usuário pode escolher qual arquivos que ele quer fazer

o download.

 

Gostaria de aproveita este meu script que estou usando para fazer o UPLOAD que esta funcionado perfeitamente da maquina do cliente

para a pasta ftp .

 

Se alguém pode me ajudar ficarei grato.

<center> 
   <form action="" method="post" enctype="multipart/form-data">
	Arquivo: <input type="file" name="arquivo">
	<input type="submit" value="Enviar">
	


</form>
<?php
// Configura o tempo limite para ilimitado
set_time_limit(0);
 
/*-----------------------------------------------------------------------------*
 * Parte 1: Configurações do Envio de arquivos via FTP com PHP
/*----------------------------------------------------------------------------*/
 
// IP do Servidor FTP
$servidor_ftp = 'ftp.caminhodoftp.com.br';
 
// Usuário e senha para o servidor FTP
$usuario_ftp = 'fulano';
$senha_ftp   = 'xxxxx';
 
// Extensões de arquivos permitidas
$extensoes_autorizadas = array( '.exe', '.jpg', '.mp4', '.mkv', '.txt' );
 
// Caminho da pasta FTP
$caminho = 'Web/fulano/';
 
/* 
Se quiser limitar o tamanho dos arquivo, basta colocar o tamanho máximo 
em bytes. Zero é ilimitado
*/
$limitar_tamanho = 0;
 
/* 
Qualquer valor diferente de 0 (zero) ou false, permite que o arquivo seja 
sobrescrito
*/
$sobrescrever = 0;
 
/*-----------------------------------------------------------------------------*
 * Parte 2: Configurações do arquivo
/*----------------------------------------------------------------------------*/
 
// Verifica se o arquivo não foi enviado. Se não; termina o script.
if ( ! isset( $_FILES['arquivo'] ) ) {
	exit('Nenhum arquivo enviado!');
}
 
// Aqui o arquivo foi enviado e vamos configurar suas variáveis
$arquivo = $_FILES['arquivo'];
 
// Nome do arquivo enviado
$nome_arquivo = $arquivo['name'];
 
// Tamanho do arquivo enviado
$tamanho_arquivo = $arquivo['size'];
 
// Nome do arquivo temporário
$arquivo_temp = $arquivo['tmp_name'];
 
// Extensão do arquivo enviado
$extensao_arquivo = strrchr( $nome_arquivo, '.' );
 
// O destino para qual o arquivo será enviado
$destino = $caminho . $nome_arquivo;
 
/*-----------------------------------------------------------------------------*
 *  Parte 3: Verificações do arquivo enviado
/*----------------------------------------------------------------------------*/
 
/* 
Se a variável $sobrescrever não estiver configurada, assumimos que não podemos 
sobrescrever o arquivo. Então verificamos se o arquivo existe. Se existir; 
terminamos aqui. 
*/
 
if ( ! $sobrescrever && file_exists( $destino ) ) {
	exit('Arquivo já existe.');
}
 
/* 
Se a variável $limitar_tamanho tiver valor e o tamanho do arquivo enviado for
maior do que o tamanho limite, terminado aqui.
*/
 
if ( $limitar_tamanho && $limitar_tamanho < $tamanho_arquivo ) {
	exit('Arquivo muito grande.');
}
 
/* 
Se as $extensoes_autorizadas não estiverem vazias e a extensão do arquivo não 
estiver entre as extensões autorizadas, terminamos aqui.
*/
 
if ( ! empty( $extensoes_autorizadas ) && ! in_array( $extensao_arquivo, $extensoes_autorizadas ) ) {
	exit('Tipo de arquivo não permitido.');
}
 
/*-----------------------------------------------------------------------------*
 * Parte 4: Conexão FTP
/*----------------------------------------------------------------------------*/
 
// Realiza a conexão
$conexao_ftp = ftp_connect( $servidor_ftp );
 
// Tenta fazer login
$login_ftp = @ftp_login( $conexao_ftp, $usuario_ftp, $senha_ftp );
 
// Se não conseguir fazer login, termina aqui
if ( ! $login_ftp ) {
	exit('Usuário ou senha FTP incorretos.');
}
 
// Envia o arquivo
if ( @ftp_put( $conexao_ftp, $destino, $arquivo_temp, FTP_BINARY ) ) {
	// Se for enviado, mostra essa mensagem
	echo 'Arquivo enviado com sucesso!';
} else {
	// Se não for enviado, mostra essa mensagem
	echo 'Erro ao enviar arquivo!';
}
 
// Fecha a conexão FTP
ftp_close( $conexao_ftp );







?>
</center>  

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se ele está em um FTP, acredito que será necessário copiar para seu servidor primeiro, e depois disponibilizar um link para o usuário, ou terá de fazer um esquema de fread + echo para copiar e imprimir ao mesmo tempo.

 

Pode também disponibilizar o link para o endereço FTP do arquivo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah intenção é que primeiro o usuário possa escolher o arquivos que estão em sua pasta, assim como ele faz para mandar.


Usando a função header(), você consegue forçar o download de um arquivo. :thumbsup:

eu não estou conseguindo lista eles.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você vai exibir a lista de arquivos com essa função. Pra baixar é outra história: você vai precisar ler o conteúdo do arquivo e usar header(), como sugerido antes. Ao clicar no nome do arquivo, você executa o procedimento de ler o arquivo desejado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você vai exibir a lista de arquivos com essa função. Pra baixar é outra história: você vai precisar ler o conteúdo do arquivo e usar header(), como sugerido antes. Ao clicar no nome do arquivo, você executa o procedimento de ler o arquivo desejado

consegui mostra todos os arquivos da pasta e coloca-los em um link e criei uma outra pagina de chamada

download só que no caso ele esta dando o seguinte erro:

 

PHP Warning: ftp_get() [<a href='function.ftp-get'>function.ftp-get</a>]: Opening BINARY mode data connection for ./web/13/compra_bateria .txt(330 bytes). in E:\home\teste\download.php on line 20

 

O meu código de download:

<?php

// define some variables
$local_file = 'php://stdout';
$server_file = isset($_GET['arquivo'])?$_GET['arquivo']:NULL;
if($server_file!=NULL)
{

$remote_dir='.'; // Caminho para o diretório remoto
$ftp_server = 'ftp.caminho.com.br'; // FTP do destino
$ftp_user_name = 'xxxxx';
$ftp_user_pass = 'xxxxx';

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

// efetuando o download
if (!ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
   
    echo "Ocorreu um erro\n";
	}

// fecha a conexão
ftp_close($conn_id);
exit;
}
?>

Na verdade cabei fazer uns teste ele não esta achando o caminho que esta sendo passado dentro do link na hora que o usuário escolhe.

 

ERRO:

PHP Warning: ftp_get() [<a href='function.ftp-get'>function.ftp-get</a>]: compra_bateria .txt: The system cannot find the file specified. in E:\home\teste\download.php on line 20

 

Lista.php

<?php

// IP do Servidor FTP
$ftp_server = 'ftp.caminho.com.br';
 
// Usuário e senha para o servidor FTP
$ftp_user_name= 'xxxxxx';
$ftp_user_pass   = 'xxxx';
$remote_dir = "./web/13/"; //diretorio

// set up basic connection
$conn_id = ftp_connect($ftp_server);

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// get contents of the current directory
$contents = ftp_nlist($conn_id, $remote_dir);

// output $contents

// listando arquivos do diretório


// exibindo
echo '

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


// fecha a conexão
ftp_close($conn_id); 
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o arquivo não for binário, não pode usar a opção FTP_BINARY

 

Talvez esta solução lhe seja útil: http://stackoverflow.com/a/9411069

 

Na verdade cabei fazer uns teste ele não esta achando o caminho que esta sendo passado dentro do link na hora que o usuário escolhe.

 

ERRO:

PHP Warning: ftp_get() [<a href='function.ftp-get'>function.ftp-get</a>]: compra_bateria .txt: The system cannot find the file specified. in E:\home\teste\download.php on line 20

Lista.php

<?php

// IP do Servidor FTP
$ftp_server = 'ftp.caminho.com.br';
 
// Usuário e senha para o servidor FTP
$ftp_user_name= 'xxxxxx';
$ftp_user_pass   = 'xxxx';
$remote_dir = "./web/13/"; //diretorio

// set up basic connection
$conn_id = ftp_connect($ftp_server);

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// get contents of the current directory
$contents = ftp_nlist($conn_id, $remote_dir);

// output $contents

// listando arquivos do diretório


// exibindo
echo '

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


// fecha a conexão
ftp_close($conn_id); 
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

você está usando str_replace pra trocar $remote_dir por uma string vazia. Assim a busca é feita sem o caminho completo. Por isso não encontra. Tem que passar o path completo pra ftp_get

Desculpa não entendi.

Como assim vc fala o caminho completo da pasta?

 

Tipo:

remote_dir = "ftp.caminho.com.br/web/13/"; //diretorio

Compartilhar este post


Link para o post
Compartilhar em outros sites

exato

 

Você passou apenas o nome do arquivo para ftp_get. Tem que passar o caminho completo

 

Mais assim não funciona ele da um erro de php warning: Invalid argument supplied for foreach():

 

Passando o arquivo ele ta passando tanto que na url parece o nome do arquivo selecionado, acho que o problema esta na hora que ele busca este arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem que acessar o arquivo passando o caminho correto deles, não apenas o nome. Você leu listou os arquivos de web/13, logo, tem que ler os arquivos desse mesmo diretório.

 

Qual código você usou no teste que deu erro no foreach?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem que acessar o arquivo passando o caminho correto deles, não apenas o nome. Você leu listou os arquivos de web/13, logo, tem que ler os arquivos desse mesmo diretório.

 

Qual código você usou no teste que deu erro no foreach?

 

Este aqui:

 

remote_dir = "ftp.caminho.com.br/web/13/"; //diretorio

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não. mostre o trecho onde faz a conexão e o ftp_get que está gerando o erro. Você mostrou só o diretório

 

então é este o trecho que da seguinte erro php warning: Invalid argument supplied for foreach():

 

se eu mudar:

remote_dir = "./web/13/"; //Isto é na lista.php

ele não da o erro e lista os arquivos da pasta certinho.

 

O erro esta na pagina download.php

trecho aonde esta dando o erro é este aqui:

// efetuando o download
if (!ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
   
    echo "Ocorreu um erro\n";
	}

Aqui ele da o seguinte erro :

PHP Warning: ftp_get() [<a href='function.ftp-get'>function.ftp-get</a>]: compra_bateria .txt: The system cannot find the file specified. in E:\home\teste\download.php on line 20

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.