Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-12-2022
kenneth_kenneth kenneth_kenneth is offline
Registrado
 
Registrado: jul 2015
Posts: 3
Poder: 0
kenneth_kenneth Va por buen camino
Post ¿Cómo escribir un archivo en un servidor FTP sobre TLS explicito desde ANDROID?

Tengo este código que funciona perfectamente en Windows, pero al ejecutar la aplicación en Android, la conexión a FTP es exitosa, pero al escribir el archivo, la aplicación se queda en pausa sin hacer nada.

Cabe señalar que en el servidor FTP, aparece que estoy cargando el archivo como en la imagen:



Este es mi código
Código:
procedure TForm1.Button1Click(Sender: TObject);
begin
    IdFTP:=TIdFTP.Create(nil);
    IdSSLIO:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
      IdFTP.Disconnect();
        {$ifdef mswindows}
          idopensslsetlibpath('C:\Users\usuario.empresa\Desktop\FTPSExample\SSL');
        {$endif}
        {$ifdef android}
          idopensslsetlibpath(TPath.GetDocumentsPath);
        {$endif}
        IdSSLIO.SSLOptions.Method:=TIdSSLVersion.sslvSSLv23;
        IdSSLIO.PassThrough:=true;
        IdFTP.IOHandler:=IdSSLIO;
        IdFTP.ListenTimeout:=10000;
        IdFTP.ReadTimeout:=10000;
        IdFTP.TransferTimeout:=10000;
        IdFTP.ConnectTimeout:=10000;
        IdFTP.Passive:=true;
        IdFTP.UseTLS:=TIdUseTLS.utUseExplicitTLS;
        IdFTP.DataPortProtection:=TIdFTPDataPortSecurity.ftpdpsPrivate;

        IdFTP.Host := '(ip_ftp)';
        IdFTP.Username := '(user)';
        IdFTP.Password := '(pass)';
        
        try
        IdFTP.Connect;

        try
            {$ifdef mswindows}
              IdFTP.Put('D:\SeLogro.txt','SeLogro.txt',false);
            {$endif}
            {$ifdef android}
              IdFTP.Put('storage/emulated/0/SeLogro.txt','SeLogro.txt',false);
            {$endif}
              ShowMessage('Ready!');
            finally
              IdFTP.Disconnect();

            end;
        except
        on E : Exception do
         begin
           ShowMessage('Exception class name = '+E.ClassName);
           ShowMessage('Exception message = '+E.Message);
         end;
        end;
end;
Encontré una pregunta similar, pero el código está en Java, ¿será posible hacerlo en Delphi 10.3?
https://stackoverflow.com/questions/...r-explicit-tls

Última edición por Neftali [Germán.Estévez] fecha: 15-12-2022 a las 09:21:29. Razón: Añadir la imagen y link
Responder Con Cita
  #2  
Antiguo 14-12-2022
dani36652 dani36652 is offline
Miembro
 
Registrado: abr 2019
Posts: 55
Poder: 6
dani36652 Va camino a la fama
1- En Android el Almacenamiento interno se describe como "/sdcard"
2- Para hacer uso del almacenamiento interno en Delphi, debe otorgar los permisos al almacenamiento
3- Android 11 y superiores es un caso peculiar, para ello le compartí el link a un repositorio para solventar eso.
4- Le sugiero meter todos sus procesos "pesados" en un Thread Y sincronizar todo lo visual dentro de dicho thread (memos, mensajes, texto en labels, etc); resulta que en Android de no hacerlo, su app parecerá congelada y después se le mostrará el mensaje de "MyApp no responde"....
Le sugiero ver el un ejemplo en este link: https://github.com/dani36652/DelphiThreadLoadingDialog

Finalmente; su app pareciera congelarse por que la ruta de guardado no era la correcta (/user/emulated/0)
en lugar de /sdcard o por que no otorgó los permisos al almacenamiento.
Le hago llegar esta corrección esperando le sea de ayuda:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
  var
  ThreadFTP: TThread;
begin
 ThreadFTP:= TThread.CreateAnonymousThread(
 procedure
 begin
  IdFTP:=TIdFTP.Create(nil);
  IdSSLIO:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);

  IdFTP.Disconnect();
  {$ifdef mswindows}
  idopensslsetlibpath('C:\Users\usuario.empresa\Desktop\FTPSExample\SSL');
  {$endif}
  {$ifdef android}
  idopensslsetlibpath(TPath.GetDocumentsPath);
  {$endif}
  IdSSLIO.SSLOptions.Method:=TIdSSLVersion.sslvSSLv23;
  IdSSLIO.PassThrough:=true;
  IdFTP.IOHandler:=IdSSLIO;
  IdFTP.ListenTimeout:=10000;
  IdFTP.ReadTimeout:=10000;
  IdFTP.TransferTimeout:=30000;
  IdFTP.ConnectTimeout:=10000;
  IdFTP.Passive:=true;
  IdFTP.UseTLS:=TIdUseTLS.utUseExplicitTLS;
  IdFTP.DataPortProtection:= TIdFTPDataPortSecurity.ftpdpsPrivate;
  IdFTP.Host := '(ip_ftp)';
  IdFTP.Username := '(user)';
  IdFTP.Password := '(pass)';
   try
   IdFTP.Connect;

     try
     {$ifdef mswindows}
     IdFTP.Put('D:\SeLogro.txt','SeLogro.txt',false);
     {$endif}
     {$ifdef android}
     //El almacenamiento interno en Android se describe como /sdcard
     //¡OJO! ACEPTE LOS PERMISOS DE ALMACENAMIENTO Y A PARTIR DE ANDROID 5.0
     //SU APP DEBE PEDIR DICHOS PERMISOS EN TIEMPO DE EJECUCIÓN (ANDROID RUNTIME PERMISSIONS)
     //PARA EL CASO DE ANDROID 11+ NECESITA INSTALAR RAD STUDIO 11 ALEXANDRIA Y APLICAR ESTA
     //SOLUCIÓN QUE DESCRIBO EN EL REPOSITORIO
     //https://github.com/dani36652/Delphi-11-Alexandria-Hacer-uso-del-Almacenamiento-en-Android-11-y-Posteriores
     IdFTP.Put('/sdcard/SeLogro.txt','SeLogro.txt',false);
     {$endif}
      TThread.Synchronize(nil,
      procedure
      begin
      ShowMessage('Ready!');
      end);
     finally
     IdFTP.Disconnect();
     end;
     except
     on E : Exception do
     begin
      TThread.Synchronize(nil,
      procedure
      begin
      ShowMessage('Exception class name = '+E.ClassName);
      ShowMessage('Exception message = '+E.Message);
      end);
     end;
   end;
 end);
 ThreadFTP.FreeOnTerminate:= True;
 ThreadFTP.Start;
end;
Responder Con Cita
  #3  
Antiguo 15-12-2022
kenneth_kenneth kenneth_kenneth is offline
Registrado
 
Registrado: jul 2015
Posts: 3
Poder: 0
kenneth_kenneth Va por buen camino
Hola que tal, ya intenté lo sugerido sin éxito alguno, la respuesta de mi servidor es la misma que la de la imagen adjunta, me dice que esta subiendo el archivo "SeLogro.txt" pero nunca termina y en mi servidor aparece el archivo ".txt" con 0 bytes, tendrás alguna otra idea, creo que ya estoy agotando todas las posibilidades, el celular de donde efectuó las pruebas tiene Android 9, espero sirva de algo y muchas gracias por tu pronta respuesta.
Responder Con Cita
  #4  
Antiguo 16-12-2022
dani36652 dani36652 is offline
Miembro
 
Registrado: abr 2019
Posts: 55
Poder: 6
dani36652 Va camino a la fama
Me parece que Android a diferencia de Windows metió ciertas restricciones con FTP por lo que se recomienda hacer uso de SFTP. Voy a investigarle, probablemente haya que escribir algo en el manifest.xml como para poder conectar mediante http. Si encuentro la solución la comparto lo antes posible.
Responder Con Cita
  #5  
Antiguo 16-12-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por dani36652 Ver Mensaje
1- En Android el Almacenamiento interno se describe como "/sdcard"
La "sdcard" es la tarjeta externa, ahí si tienes que "jugar" con los permisos necesarios.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
FTP explicíto sobre TLS newtron Varios 2 26-04-2022 09:34:43
Conexión con FTP explícito sobre TLS andres_89 C++ Builder 7 15-10-2015 18:00:35
Sobre Escribir un archivo de texto mangel Varios 7 04-06-2012 22:29:04
escribir cliente desde servidor WEB JuanErasmo .NET 4 15-01-2008 15:48:04
Programa para sobre escribir un archivo Yusk333 C++ Builder 9 29-09-2007 21:43:43


La franja horaria es GMT +2. Ahora son las 14:25:46.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi