Damon 20 Denunciar post Postado Novembro 12, 2014 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
ExtremsX 58 Denunciar post Postado Novembro 12, 2014 Você já conseguiu listar os arquivos? Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Novembro 12, 2014 Para download ainda não. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Novembro 12, 2014 Usando a função header(), você consegue forçar o download de um arquivo. :thumbsup: Compartilhar este post Link para o post Compartilhar em outros sites
ExtremsX 58 Denunciar post Postado Novembro 12, 2014 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
Damon 20 Denunciar post Postado Novembro 12, 2014 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
Beraldo 864 Denunciar post Postado Novembro 12, 2014 Talvez isto ajude: http://php.net/manual/pt_BR/function.ftp-rawlist.php Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Novembro 12, 2014 Talvez isto ajude: http://php.net/manual/pt_BR/function.ftp-rawlist.php Sim já deu uma ajuda boa, usei ftp_nlist ele me retornou um array com os dados dentro da pasta, só que eu tenho que deixa estes dados disponíveis para que o usuário possa escolher qual ele deseja baixa. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Novembro 12, 2014 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
Damon 20 Denunciar post Postado Novembro 12, 2014 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
Beraldo 864 Denunciar post Postado Novembro 12, 2014 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 Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Novembro 12, 2014 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
Beraldo 864 Denunciar post Postado Novembro 12, 2014 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 Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Novembro 12, 2014 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
Beraldo 864 Denunciar post Postado Novembro 12, 2014 exato Você passou apenas o nome do arquivo para ftp_get. Tem que passar o caminho completo Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Novembro 12, 2014 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
Beraldo 864 Denunciar post Postado Novembro 12, 2014 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
Damon 20 Denunciar post Postado Novembro 12, 2014 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
Beraldo 864 Denunciar post Postado Novembro 12, 2014 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 Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Novembro 12, 2014 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