UPload - Transferência de arquivos PHP
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:
[b]Mas para Enviar os arquivos não estou conseguindo, mudei o ftp_put para o ftp_raw da seguinte forma:[/b]
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:
O interessante é que, fazendo a transferência pelo FileZilla Client não dá erro o arquivo é transferido normalmente, conforme podemos ver no log abaixo.
A pergunta é: O que estou fazendo de errado? Existe outra solução?
ps: Não muito conhecimento com PHP
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
Curtidas 0
Respostas
Dirceu Morais
12/08/2023
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>";
GOSTEI 0
Dirceu Morais
12/08/2023
Estava usando uma versão antiga do FileZilla Server, atualizei para a versão mais recente.
Mudei meu código para:
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
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.
GOSTEI 0
Dirceu Morais
12/08/2023
Pode marcar o post como resolvido.
Consegui descobrir
Obrigado a todos que leram meu post e pensaram em me ajudar.
Consegui descobrir
Obrigado a todos que leram meu post e pensaram em me ajudar.
GOSTEI 0
Israel Ruiz
12/08/2023
Ó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?
GOSTEI 0
Dirceu Morais
12/08/2023
Pode marcar o post como resolvido.
Consegui descobrir
Obrigado a todos que leram meu post e pensaram em me ajudar.
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
GOSTEI 0