UPload - Transferência de arquivos PHP

12/08/2023

0

Amigos estou com um problemão aqui já tem alguns dias e não consigo resolver.

Tenho um aplicativo desenvolvido em PHP, CSS, HTML tudo misturado, hehehe, este aplicativo funcionou muito bem até meados de julho/2023, usando para transferência de dados usando o comando: ftp_put($ftp, $ftp_arquivo, $local_arquivo, FTP_ASCII); e para receber os arquivos usando o ftp_get($conn_id,$local_file, $remote_file, FTP_ASCII).

Sendo que para ENVIO LOCAL, na mesma rede continua funcionando, mas se estou FORA usando outro Wi-fi não funciona. Aplicativo conecta mas não consegue transferir os arquivos, nem para Download e Upload.

Para receber o arquivos necessários consegui resolver da seguinte forma:
           $curl = curl_init($ftp_server.$ftp_porta);
           $fo = fopen("$local_file", 'w');
           
           curl_setopt($curl, CURLOPT_URL, "ftp://$ftp_server:$ftp_porta/$remote_file"); #input
           curl_setopt($curl, CURLOPT_TRANSFERTEXT, TRUE);
           curl_setopt($curl, CURLOPT_FILE, $fo); #output
           curl_setopt($curl, CURLOPT_USERPWD, "$ftp_user_name:$ftp_user_pass");
           curl_setopt($curl, CURLOPT_FRESH_CONNECT, true);
           if(file_exists($localFile)) {
               curl_setopt($curl, CURLOPT_RESUME_FROM, filesize($local_File));
           }
           
           curl_exec($curl);
           
           fclose($fo);
           
           curl_close($curl);
 


[b]Mas para Enviar os arquivos não estou conseguindo, mudei o ftp_put para o ftp_raw da seguinte forma:[/b]
          $ftp = ftp_connect($servidor,$porta); // Retorno: true ou false
          ftp_raw($ftp, "AUTH TLS");
          ftp_raw($ftp, "AUTH SSL");
          
          // Faz o login no servidor FTP
          $login = ftp_login($ftp, $usuario, $senha); // Retorno: true ou false
          //*****************************************************************//
          ftp_raw($ftp, "CWD /backup");
          ftp_raw($ftp, "TYPE A");
          // Envia o arquivo pelo FTP em modo ASCII
          $connect = ftp_raw($ftp, "PASV");
                  
          // parse the response and build the IP and port from the values
          if (count($connect) > 0 && preg_match("/.*\((\d+),(\d+),(\d+),(\d+),(\d+),(\d+)\)/", $connect[0], $m)) {
              $address="{$m[1]}.{$m[2]}.{$m[3]}.{$m[4]}";
              $port=$m[5] * 256 + $m[6];
              
              print_r(ftp_raw($ftp, "STOR $ftp_arquivo"));
              
              $sock = socket_create(AF_INET, SOCK_STREAM, 0);
              if ($sock) {
                  socket_connect($sock, $address, $port);
                  socket_write($sock, file_get_contents($ftp_arquivo));
                  socket_close($sock);
              }
          }
          ftp_raw($ftp,'QUIT');


Dessa forma que estou tentando transferir, quase que dá certo, executa todos os processos, aparece a mensagem que esta sendo transferido, mas dá erro conforme log abaixo:
(000036)11/08/2023 16:38:50 - mymobile (179.54.xxx.xxx)> PASV
(000036)11/08/2023 16:38:50 - mymobile (179.54.xxx.xxx)> 227 Entering Passive Mode (xxx,xxx,xxx,xxx,19,171)
(000036)11/08/2023 16:38:50 - mymobile (179.54.xxx.xxx)> STOR pedidos1013110823-10.xml
(000036)11/08/2023 16:39:00 - mymobile (179.54.xxx.xxx)> 425 Can't open data connection.



O interessante é que, fazendo a transferência pelo FileZilla Client não dá erro o arquivo é transferido normalmente, conforme podemos ver no log abaixo.
(000035)11/08/2023 16:37:36 - mymobile (179.54.xxx.xxx)> 200 Type set to A
(000035)11/08/2023 16:37:36 - mymobile (179.54.xxx.xxx)> PASV
(000035)11/08/2023 16:37:36 - mymobile (179.54.xxx.xxx)> 227 Entering Passive Mode (xxx,xxx,xxx,xxx,19,169)
(000035)11/08/2023 16:37:36 - mymobile (179.54.xxx.xxx)> STOR pedidos1013110823-10.xml
(000035)11/08/2023 16:37:36 - mymobile (179.54.xxx.xxx)> 150 Connection accepted
(000035)11/08/2023 16:37:36 - mymobile (179.54.xxx.xxx)> 226 Transfer OK

A pergunta é: O que estou fazendo de errado? Existe outra solução?

ps: Não muito conhecimento com PHP
Dirceu Morais

Dirceu Morais

Responder

Posts

15/08/2023

Dirceu Morais

Mudei de ftp para curl_setopt o arquivo criou o arquivo no servidor, mas não copiou o conteúdo do arquivo, o arquivo fica vazio.

        $ch = curl_init();
         $diretorioRemoto = '/backup/meuarquivo.txt';  //local do arquivo no servidor
         $localfile = './envia/meuarquivo.txt'; //local do arquivo no cliente
   
         $fp = fopen($localfile, 'r');
         curl_setopt($ch, CURLOPT_URL, "ftp://$serverHost:$ftp_porta/$diretorioRemoto");
         curl_setopt($ch, CURLOPT_UPLOAD, 1);
         curl_setopt($ch, CURLOPT_INFILE, $fp);
         curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
         curl_setopt($ch, CURLOPT_USERPWD, "$serverUser:$serverPass");
         curl_exec ($ch);
         $error_no = curl_errno($ch);
         curl_close ($ch);
         if ($error_no == 0) {
             $error = 'File uploaded succesfully.';
         } else {
             $error = 'File upload error.';
         }
         echo "<script language='JavaScript'>parent.alert('Transmissão do arquivo $error   $error_no');</script>";
Responder

17/08/2023

Dirceu Morais

Estava usando uma versão antiga do FileZilla Server, atualizei para a versão mais recente.
Mudei meu código para:
$ftp = ftp_connect($server,$port); // Retorno: true ou false
ftp_raw($ftp, "AUTH TLS");
ftp_raw($ftp, "AUTH SSL");
$login = ftp_login($ftp, $user, $password); // Retorno: true ou false
ftp_raw($ftp, "CWD /backup");
ftp_raw($ftp, "TYPE A");
$connect = ftp_raw($ftp, "PASV"); 
ftp_raw($ftp, "STOR $ftp_arquivo");
ftp_raw($ftp,'QUIT');


No roteador:
-Liberei o DMZ direcionando o IP para a maquina local
-Liberei a Porta 2121 e direcionei o IP para maquina local

No Firewall liberei a porta: 2121 e as portas passivas: 50000-50100
No FileZilla informe a porta: 2121 e as portas Range de portas: 50000-50100

Mesmo assim o arquivo chega no servidor vazio.


Responder

25/08/2023

Dirceu Morais

Pode marcar o post como resolvido.
Consegui descobrir 


Obrigado a todos que leram meu post e pensaram em me ajudar.
Responder

31/08/2023

Israel Ruiz

Ótimo e qual foi a solução? Qual das ações você realizou que fez funcionar? Pode ser útil explicar-nos para que se passarmos pela mesma situação, tenhamos um norte a seguir, o que você acha?
Responder

07/02/2024

Dirceu Morais

Pode marcar o post como resolvido.
Consegui descobrir 


Obrigado a todos que leram meu post e pensaram em me ajudar.



Galera 'EU NOVAMENTE'

A solução que encontrei fui simplesmente colocar um "S" no put.

$envio = @ftp_puts($ftp, $ftp_arquivo, $local_arquivo, FTP_ASCII);


Mas agora começou a dar o mesmo problema. Só consigo receber o arquivo no meu Aplicativo para transmitir não estou conseguindo.
;-( ;-< Tô tristi

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar