Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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>Para download ainda não.
Usando a função header(), você consegue forçar o download de um arquivo. :thumbsup:
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
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.
Talvez isto ajude:
>
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.
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
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';// 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);
?>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
>
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';// 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);
?>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
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
exato
Você passou apenas o nome do arquivo para ftp_get. Tem que passar o caminho completo
>
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.
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?
>
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
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
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
qual o valor de $server_file? Esse é o problema. Você está passando um caminho que não existe
qual o valor de $server_file? Esse é o problema. Você está passando um caminho que não existe
Ele ta recebendo o GET
$server_file = isset($_GET["arquivo"])?$_GET["arquivo"]:NULL;
Então, esse é o problema. Você passa por GET só o nome do arquivo. Na hora de passar o valor pre ftp_get, tem que concatenar o caminho até a pasta e o nome do arquivo, caso contrário o FTP vai procurar o arquivo na pasta atual
Então, esse é o problema. Você passa por GET só o nome do arquivo. Na hora de passar o valor pre ftp_get, tem que concatenar o caminho até a pasta e o nome do arquivo, caso contrário o FTP vai procurar o arquivo na pasta atual
Então mas na dowloand.php tem o caminho da pasta, só que não esta concatenado.
Igual voce me falou quando eu passo o caminho da pasta inteiro via GET ele da aquele primeiro erro de FTP_BINARY vou posta o download.php inteiro pra vc da uma olhada.
<?php
// define some variables
$local_file = 'php://stdout';
$server_file = isset($_GET["arquivo"])?$_GET["arquivo"]:NULL;
if($server_file!=NULL)$remote_dir= "./web/13/"; // Caminho para o diretório remoto
$ftp_server = 'ftp.caminho.com.br'; // FTP do destino
$ftp_user_name = 'xxxxxxx';
$ftp_user_pass = 'xxxxxxx';
// 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;
}
?>Você cria $remote_dir, mas nunca a usa. Faça assim:
>
$remote_dir= "./web/13/"; // Caminho para o diretório remoto
$server_file = $remote_dir . $server_file;
// restante do codigo
>
Você cria $remote_dir, mas nunca a usa. Faça assim:
Então desse modo da o erro de FTP_BINARY
PHP Warning: ftp_get() [<a href='function.ftp-get'>function.ftp-get</a>]: Opening BINARY mode data connection for ./web/13/Admin-icon.png(19432 bytes).
Criei uma função para identifica o tipo de arquivo para ver se era binário ou outro tipo:
<?php
// define some variables
$local_file = 'php://stdout';
$server_file = isset($_GET["arquivo"])?$_GET["arquivo"]:NULL;
if($server_file!=NULL)$remote_dir= "./web/13/"; // Caminho para o diretório remoto
$ftp_server = 'ftp.caminho.com.br'; // FTP do destino
$ftp_user_name = 'xxxxx';
$ftp_user_pass = 'xxxxxxxx';
$server_file = $remote_dir . $server_file;
// conectando
$conn_id = ftp_connect($ftp_server);
// login
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
function get_ftp_mode($file) $path_parts = pathinfo($file);
if (!isset($path_parts['extension'])) return FTP_BINARY;
switch (strtolower($path_parts['extension'])) {
case 'am':case 'asp':case 'bat':case 'c':case 'cfm':case 'cgi':case 'conf':
case 'cpp':case 'css':case 'dhtml':case 'diz':case 'h':case 'hpp':case 'htm':
case 'html':case 'in':case 'inc':case 'js':case 'm4':case 'mak':case 'nfs':
case 'nsi':case 'pas':case 'patch':case 'php':case 'php3':case 'php4':case 'php5':
case 'phtml':case 'pl':case 'po':case 'py':case 'qmail':case 'sh':case 'shtml':
case 'sql':case 'tcl':case 'tpl':case 'txt':case 'vbs':case 'xml':case 'xrc':
return FTP_ASCII;
}
return FTP_BINARY;
}
// efetuando o download
if (!ftp_get($conn_id, $local_file, $server_file, get_ftp_mode($server_file))){
//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;
}
?>
Você já conseguiu listar os arquivos?