PDA

Ver la Versión Completa : Cliente FTP


barakuda
04-03-2014, 19:39:13
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"

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:
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 (http://www.clubdelphi.com/foros/member.php?u=3561)

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.

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.


........................................
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
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