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

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;

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;
}
?> 

Ai ele não dar nenhum erro mais não baixa o arquivo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usar php://stdout realmente funciona? Talvez esteja aí o problema. Tente usar readfile() e header, como já sugerido

 

Uai era para funciona neh !!rsrs

Vou refazer usando header para ver o que da, daqui a pouco te dou feedback.

Usar php://stdout realmente funciona? Talvez esteja aí o problema. Tente usar readfile() e header, como já sugerido

 

Usando o header deu o mesmo problema, ele não da erro mas também não baixa.

$pasta = './web/13'; //nome da pasta no seu FTP, onde os arquivos foram guardados 

if(isset($_GET['arquivo']) && file_exists("{$pasta}/".$_GET['arquivo']))
 { $file = $_GET['arquivo']; // variável que pega o nome do arquivo que deseja fazer o download 
 
 $type = filetype("{$pasta}/{$file}"); //pega o tipo do arquivo que deseja fazer o download 
 $size = filesize("{$pasta}/{$file}"); // pega o tamanho do arquivo 
 header("Content-Description:File Transfer"); //descriptografando para fazer o download 
 header("Content-Type:($type)"); // pegando o tipo 
 header("Content-lenght:($size)"); // pegando o tamanho 
 header("Content-Disposition: attachment; filename=$file"); //verificando e inicializando o downlaod
 readfile("{$pasta}/{$file}"); //fazendo o download 
 
 exit; // saindo 
 }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifique se todas as mensagens de erro estão ativas, como mostra este tópico: http://forum.imasters.com.br/topic/375800-orientaes-para-uma-boa-participao/

 

Ativei a mensagem de erro e nada:

 

<?php

ini_set( 'display_errors', true );

error_reporting( E_ALL );

$pasta = './web/13/'; //nome da pasta no seu FTP, onde os arquivos foram guardados 

if(isset($_GET['arquivo']) && file_exists("{$pasta}/".$_GET['arquivo']))
 { $file = $_GET['arquivo']; // variável que pega o nome do arquivo que deseja fazer o download 
 
 $type = filetype("{$pasta}/{$file}"); //pega o tipo do arquivo que deseja fazer o download 
 $size = filesize("{$pasta}/{$file}"); // pega o tamanho do arquivo 
 header("Content-Description:File Transfer"); //descriptografando para fazer o download 
 header("Content-Type:($type)"); // pegando o tipo 
 header("Content-lenght:($size)"); // pegando o tamanho 
 header("Content-Disposition: attachment; filename=$file"); //verificando e inicializando o downlaod
 readfile("{$pasta}/{$file}"); //fazendo o download 
 
 exit; // saindo 
 }







?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

adicione um else. pode ser que nem esteja entrando no if.

 

também dê um echo no caminho completo do arquivo, para ver se está sendo acessado o local correto

 

Realmente não esta entrando no if.

Compartilhar este post


Link para o post
Compartilhar em outros sites

separe as coisas:

 

 

if ( isset($_GET['arquivo']) )
{
    $path = pasta . "/" . $_GET['arquivo'];
    if ( file_exists( $path ) )
    {
         // ler o arquivo
    }
    else
    {
         echo "path nao existe: " . $path;
    }
}
else
{
    echo 'get arquivo nao existe';
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

separe as coisas:

if ( isset($_GET['arquivo']) )
{
    $path = pasta . "/" . $_GET['arquivo'];
    if ( file_exists( $path ) )
    {
         // ler o arquivo
    }
    else
    {
         echo "path nao existe: " . $path;
    }
}
else
{
    echo 'get arquivo nao existe';
}

Ele não esta encontrando a pasta o GET esta recebendo o arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

então você passou o caminho errado. ou o ftp_get não copiou o arquivo pro servidor local

esse caminho é o mesmo que estava na outra função e outra função estava achando normalmente

acho que o ftp_get que não esta copiando para o servidor local.

Compartilhar este post


Link para o post
Compartilhar em outros sites

é só abrir a pasta e ver se o arquivo está lá. Se não estiver, é porque ftp_get realmente falhou

 

tem que passo o local aonde vai baixo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não está testando na sua máquina? Eu falei pra você abrir a pasta e ver se o arquivo do FTP está lá. Esqueça o PHP nisso

Cara acho que já estou ficando meio doido aqui, estou até escrevendo errado !!kkkk

 

Respondendo sua pergunta, sim eu olhei na pasta local e realmente nenhum arquivos esta lá.

 

Cara vamos voltar naquele código do php://stdout aqui eu sei ta passando pelo ftp_get.

 

 

<?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 = 'xxxxx';
$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': case 'png': case'jpg':
		case 'pdf': case 'cdr':
            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";
	}
else{

  echo "Arquivo baixado com sucesso.";
}


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

Este pedaço aqui não seria o caminho do pc local

$remote_dir= "./web/13/";  // Caminho para o diretório remoto

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.