Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Cliente FTP (https://www.clubdelphi.com/foros/showthread.php?t=85336)

barakuda 04-03-2014 19:39:13

Cliente FTP
 
Buenas,
Estoy desarrollando una app la cual recoge datos y posteriormente los debe enviar por ftp a un ordenador.
Siempre suelo desglosar la aplicación en otras para probar por separado y e aquí lo que vendría a ser la parte que envía el fichero.

El siguiente código conecta, valida y envía el fichero pero es como si una vez enviado no desconectase dándome en el terminal error "Read timed out"

Código Delphi [-]
procedure TForm2.Button1Click(Sender: TObject);
var
   clienteFtp: TIdFTP;
 begin
   clienteFtp := TIdFTP.Create(Self);
   try
     with clienteFtp do
     begin
       Username := 'david';
       Password := '1234';
       Host := '192.168.1.25';
       Connect; // Conectamos
       if connected  then
       begin
       ShowMessage('Conectado al servidor FTP');
       Put(TPath.Combine(TPath.GetDocumentsPath, 'subir.txt'), 'subir.txt', False);
       Disconnect;
       end;

     end;
      except
    on EConvertError  do
    ShowMessage('Error Al Conectar al servidor FTP');
   end;
 end;

Como curiosidad si comento la linea:
Código Delphi [-]
Put(TPath.Combine(TPath.GetDocumentsPath, 'subir.txt'), 'subir.txt', False);
funciona, correctamente es decir, el cliente inicia sesión en el servidor de ftp, en el terminal muestra el mensaje y al aceptar se puede ver en el servidor que el cliente a desconectado.
Alguna sugerencia, gracias por adelantado.

Casimiro Notevi 04-03-2014 19:56:55

¿No tiene un evento que salte cuando ha terminado de hacer la subida?
Supongo que debe tenerlo, y es ahí donde debes desconectar.

Por cierto, recuerda poner títulos descriptivos a tus preguntas, gracias :)

barakuda 04-03-2014 20:18:55

Gracias casimiro por responder,

acabo de probar en el evento IdFTP1AfterPut y en IdFTP1WorkEnd pero el resultado es el mismo, la aplicación del móvil se "congela" y acaba apareciendo el mensaje, "Read timed out".
La ruta del fichero esta bien ya que si adrede la modifico muestra en el terminal el mensaje que no encuentra el fichero.

¿Puede deberse a algún fallo por parte de la compatibilidad del componente con android?
Gracias por las sugerencias.

Casimiro Notevi 04-03-2014 20:31:17

La verdad es que no he usado esos componentes. ¿No trae alguna demo?

Desde luego, si tienes esos eventos de fin de put y de work, debes usarlo,

barakuda 04-03-2014 20:42:24

Gracias casimiro,
pues en la web de embarcadero no e sabido encontrar ninguna demo acerca de como utilizar el ftp, lo mas "raro" es que el mismo listado tan solo variando la linea del put y adaptándola para entorno escritorio Put('c:/subir.txt' ,'subir.txt', false) el listado funciona bien.

gracias por adelantado!!

Neftali [Germán.Estévez] 05-03-2014 09:51:57

Revisa los permisos de la aplicación.
¿Es posible que alguna falta de permisos te esté bloqueando la subida?

barakuda 05-03-2014 10:40:05

Gracias Neftali

yo pensé también en eso pero el caso es que si lo sube y al completo, el problema es como si no supiese que se completo la subida quedándose "parado" en la linea del idFTP1.PUT

jhonalone 01-03-2019 20:09:23

Hola, compañeros.
Estoy teniendo exactamente el mismo problema que barrakuda.
No se si barrakuda lo resolvió hace 4 años.
Código Delphi [-]
FS.Clear;
         Memo1.Lines.SaveToStream(FS); //Para grabar nuevamente en internet
      // Hacemos los cambios necesarios 
         FS.Position := 0;
         // Cambiamos el nombre al fichero en internet
         IdFTP1.Rename(Filename, FileTemp); // Aunque no borres antes no da error
         
         IdFTP1.Put(FS, FileName, False, 0); // Subimos el fichero modificado

Os voy a dar una pista por si sirve de algo.

Este mismo código funciona perfectamente si el dispositivo android está conectado por Wi-Fi.

Mis disculpas por abrir un post de hace tanto tiempo.

Saludos a todos. Y gracias por vuestra ayuda.

jhonalone 03-03-2019 21:34:53

Hola a todos.

Como es mi costumbre cuando resuelvo algo, os dejo la solución que a mí me ha funcionado.

Mi operador telefónico en casa y en el móvil es Orange. (No sé si el problema sucede con otros operadores)

Como os comentaba, cuando uso el móvil con el Wi-Fi de casa no hay ningún problema, los ficheros se suben por FTP a mi Web sin problemas.

El problema surgió al intentar hacer lo mismo desconectando el móvil de la Wi-Fi. Y utilizar los datos móviles del dispositivo,

He llegado a la conclusión de que el servidor que usa el operador es el que da el problema. Pues con ficheros realmente pequeños no da problemas. Cuando digo pequeños es de 1000 bytes o poco más.

Yo estaba intentando subir un fichero de 17600 bytes (Que a mí me parece pequeño...)

Al final he optado por el lema de Julio César: "Divide y vencerás" y así ha sido.

Dejo un fragmento de código por si sirve a alguien.

Código Delphi [-]
........................................
type
  TForm1 = class(TForm)
    .....
    Memo1: TMemo;
    ......

........................................
var

filename, FileTemp, FileUsed : String;
idFTP1 : TidFTP;
FS, FS2, FSInter: TMemoryStream;

................................................

        FS.Clear;
         Memo1.Lines.SaveToStream(FS); //Para grabar nuevamente en internet
      
         Sleep(300);
         FS.Position := 0;
         // Tenemos que subir el fichero poco a poco porque cuando
         // usamos los datos móviles en el dispositivo no sube el fichero
         // de una vez. PARECE QUE CON WIFI SI QUE LO SUBE
         I := FS.Size - FS.Position;
         if I > 1000 then I := 1000;

         FSInter.Clear;
         FSInter.CopyFrom(FS,I); // Si I > FS.Size - FS.Position lee
         FSInter.Position := 0;  // fuera de FS.Size y daria error
         IdFTP1.Put(FSInter, FileName, False, 0);

         while FS.Position < FS.Size
         do begin
            I := FS.Size - FS.Position;
            if I > 1000 then I := 1000;

            FSInter.Clear;
            FSInter.CopyFrom(FS,I); // Si I > FS.Size - FS.Position lee
            FSInter.Position := 0;  // fuera de FS.Size y daria error
            IdFTP1.Put(FSInter, FileName, True, 0);
            end;

Saludos cordiales.

Ñuño Martínez 06-03-2019 13:34:44

Genial que hayas dado con una solución. Y gracias por compartirla.

roman 06-03-2019 15:11:46

Cita:

Empezado por jhonalone (Mensaje 530929)
El problema surgió al intentar hacer lo mismo desconectando el móvil de la Wi-Fi. Y utilizar los datos móviles del dispositivo,

He llegado a la conclusión de que el servidor que usa el operador es el que da el problema. Pues con ficheros realmente pequeños no da problemas. Cuando digo pequeños es de 1000 bytes o poco más.

Aunque has resuelto el problema, no deja de ser extraño tener que partir el envío. Supongo que el problema está relacionado con la velocidad de transferencia: con wi-fi el envío será instantáneo. No sé cómo se hace con Delphi, pero en android todo este tipo de operaciones debe hacerse en segundo plano justo para no congelar la interfaz. Quizá el IdFTP ya lo maneje de por sí, pero si no, entonces habría que meter la subida del archivo en segundo plano.

// Saludos


La franja horaria es GMT +2. Ahora son las 19:18:31.

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