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)
-   -   [SOLUCIONADO] Bajar/Subir Ficheros desde/a mi web por FTP (https://www.clubdelphi.com/foros/showthread.php?t=91997)

jhonalone 22-06-2017 20:44:02

[SOLUCIONADO] Bajar/Subir Ficheros desde/a mi web por FTP
 
Hola de nuevo, amigos del foro.
El problema que me ocupa ahora es el título del hilo. Bueno, los archivos serían fundamentalmente de TEXTO.
Como siempre, antes de pedir vuestra ayuda, llevo varios días buscando en la red.
He encontrado varias referencias, entre ellas una de Neftalí (como no).
Pero no me funcionaron ninguna.

Mi servidor es https. Al intentar las soluciones por TidHTTP no funcionaron. La solución de Neftalí a este problema no supe resolverla.

Prefiero hacerlo por FTP .

He visto varias soluciones con este método, pero (ni replicando el código) he conseguido ni siquiera conectar con mi web.

De todos los ejemplos que he encontrado, me ha parecido el más completo este:

Código Delphi [-]
procedure TForm4.Button1Click(Sender: TObject);
var

filename : String;
Thread : TThread;
idFTP1 : TidFTP;
FS : TMemoryStream;
sPath :String;

begin
   FileName := '/Imagen.jpg';
FileName := '/ImgMaps/2YUxJ.jpg';
Thread := TThread.CreateAnonymousThread(
  procedure
  begin
    IdFTP1.Host := 'xxx.xxx.xxx';
    IdFTP1.Username := 'xxxxxx';
    IdFTP1.Password := 'xxxxx';
    IdFTP1.Passive := True;
    IdFTP1.ConnectTimeout := 60000;
    Fs := TMemoryStream.Create;
    try
      IdFTP1.Connect;
      try
        IdFTP1.TransferType := fsBinary;
        IdFTP1.Get(FileName, FS);
      finally
        IdFTP1.Disconnect;
      end;
      FS.Position := 0;
      TThread.Synchronize(nil,
        procedure
        begin
          Image1.Bitmap.LoadFromStream(FS);
        end
      );
    finally
      Fs.Free;
    end;
  end
);
Thread.OnTerminate := ThreadTerminated;
Thread.Start;
end;

procedure TForm4.ThreadTerminated(Sender: TObject);
begin
  if TThread(Sender).FatalException <> nil then begin
    ShowMessage('Failed')
  end else begin
    ShowMessage('Success');
  end;
end;

Como digo, he intentado replicarlo, CON UNA IMAGEN, aunque esto no es lo que pretendo. Sólo para comprobar si funcionaba, pero no me ha funcionado. Me da el mensaje "Failed".

Buscando errores, y sabiendo que mi web no permite ftp "anónimo" (Lo he comprobado en CuteFTP 9) he intentado probar quitando el TThread y me provoca un "Access Violation" al asignar los valores de acceso al FTP, cuando no están dentro del Thread.
Código Delphi [-]
 IdFTP1.Host := 'xxx.xxx.xxx'; // Lógicamente no es xxx.xxx.xxx sino los valores verdaderos. PROVOCA EL ERROR


Bueno. no quiero aburrir más.
Agradecería información sobre el tema. Está claro que nunca hice nada parecido (y, conociendo mis posibilidades y mi suerte, probablemente no lo haré nunca).

Sigo buscando....

Saludos cordiales.

Neftali [Germán.Estévez] 23-06-2017 08:41:56

Cita:

Empezado por jhonalone (Mensaje 518599)
El problema que me ocupa ahora es el título del hilo. Bueno, los archivos serían fundamentalmente de TEXTO.

Creo que la opción te FTP te dará menos problemas, aunque por HTTPS debería funcionar.

Cita:

Empezado por jhonalone (Mensaje 518599)
He encontrado varias referencias, entre ellas una de Neftalí (como no).
Pero no me funcionaron ninguna.
Mi servidor es https. Al intentar las soluciones por TidHTTP no funcionaron. La solución de Neftalí a este problema no supe resolverla.

A saber, es que este tío publica cosas muy raras... :D:D

Imagino que has llegado a este enlace:
http://neftali.clubdelphi.com/tidhtt...es-de-una-web/
Al final están las modificaciones para utiliar HTTPS en lugar de HTTP (que era lo que inicialmente usaba el artículo).
Tal y como comento, hay que añadir un nuevo componente TIdSSLIOHandlerSocket. Y revisar bien la versión de la DLL's porque además suelen dar problemas. Hay que encontrar las que funcionan con la versión de las Indy que utilizas y tu sistema operativo.

No comentas que error te da.
Otra opción es que publiques un link (de tu página) con un fichero "de prueba" para que podamos testear la descarga.

Esta otra unit (http://neftali.clubdelphi.com/ejempl...nfoTrackTh.zip) que también puedes encontrar en mi blog, con la explicación completa en la entrada: "Obtener información de una canción" (http://neftali.clubdelphi.com/obtene...de-una-cancin/) hace la descarga de una imagen, pero en este caso por HTTP. Sólo habría que añadirle la parte del componente anteriormente citado (para acceder a HTTPS).

Cita:

Empezado por jhonalone (Mensaje 518599)
Prefiero hacerlo por FTP .
He visto varias soluciones con este método, pero (ni replicando el código) he conseguido ni siquiera conectar con mi web.
De todos los ejemplos que he encontrado, me ha parecido el más completo este:

Pues por FTP, debería funciona también sin problemas. Usa cualquier ejemplo de conexion a FTP. En los foros seguros que encuentras varios. Empieza por uno que NO UTILICE threads, ya que te será más sencillo de probar.
Revisa que ni el Antivirus ni el Firewall te estén bloqueando.

http://www.clubdelphi.com/foros/show...21&postcount=2
https://www.clubdelphi.com/foros/sho...54&postcount=1
http://www.clubdelphi.com/foros/show...11&postcount=9

Cita:

Empezado por jhonalone (Mensaje 518599)
Como digo, he intentado replicarlo, CON UNA IMAGEN, aunque esto no es lo que pretendo. Sólo para comprobar si funcionaba, pero no me ha funcionado. Me da el mensaje "Failed".
Buscando errores, y sabiendo que mi web no permite ftp "anónimo" (Lo he comprobado en CuteFTP 9) he intentado probar quitando el TThread y me provoca un "Access Violation" al asignar los valores de acceso al FTP, cuando no están dentro del Thread.

Es raro que sólo te de ese error.
Te recomiendo que pruebes uno de los ejemplos anteriores, y revises lo del bloqueo.
Con los mismos datos que usas con cualquier programa FTP te debería funcionar.

Revisa puerto, modo pasivo,... en general utiliza en el componente las mismas propiedades que en la conexión de tu programa.

jhonalone 23-06-2017 14:56:50

Lo primero, muchas gracias. Neftalí.

El error "Failed" está en el código de arriba. Como comprobación del resultado del Thread.

El error que da cuando intento asignar los valores a TidFTP.Host (o cualquier otro) es el desagradable "Access violation..."

He revisado los links que me dejaste. Básicamente es el mismo código que yo uso, pero sin el Thread.

Veo que todos los ejemplos están orientados a Windows y creo que no dije (quizá lo dí por sentado al hacer la publicación en el foro de Android), no dije que la descarga la intento hacer desde un dispositivo Android. Mis disculpas.

Me he dado cuenta cuando Neftalí se refería al firewall.

De todos modos, voy a probarlo desde Windows y os cuento.

Aunque quede claro que mi necesidad es para Android.

Saludos cordiales.

Neftali [Germán.Estévez] 23-06-2017 15:04:03

Cita:

Empezado por jhonalone (Mensaje 518646)
Veo que todos los ejemplos están orientados a Windows y creo que no dije (quizá lo dí por sentado al hacer la publicación en el foro de Android), no dije que la descarga la intento hacer desde un dispositivo Android.

Error mio, por no fijarme en el foro.
En este caso i recomendación va por otro lado.

En esta aplicación del último concurso de Embarcadero (http://neftali.clubdelphi.com/funwit...a-foto-del-da/) tienes el código fuente de cómo descargar una imagen desde un HTTPS.
Que es lo que hare la aplicación para cada foto diaria.
En ese caso también se utiliza un Thread, pero funciona en Android.

jhonalone 23-06-2017 16:45:52

¡¡Maravilloso...! Neftali.
El vídeo y el código.
Si no ganaste el concurso, por lo menos mereces un premio.^\||/^\||/^\||/

Da gusto ver tu código tan ordenadito y tan hipermegacomentado.

Llegué hasta aqui...
Código Delphi [-]
procedure TFrameImagen.DescargarImagen(ABitmapND:TBitmap; pForceDownload:boolean=False);
var
  pathImages, fMini:string;
  URI:TidURI;
  LSart:Int64;
begin


Pero me pierdo. Es demasiado para mí...

Yo necesito cosas más simples... (no llego a tanto)

Sabes que mi idea es hacerlo por FTP para evitar entradas no deseadas sobre todo.

Agradezco tu buena voluntad.
Seguiré buscando una solución.

Saludos ¡Genio!

jhonalone 24-06-2017 20:53:06

Hola a todos.

En contra de la extendida costumbre en este foro de comentar, "gracias a todos, pero ya he resuelto el problema" y no dejar constancia de la solución que se ha utilizado, yo no comulgo con ésa idea y, cuando resuelvo algo, bien o mal, me gusta compartir el resultado, por si puede ser útil a otro visitante que tenga el mismo problema.

Os dejo la solución que me ha funcionado a mí:
Código Delphi [-]

unit Unit4;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Controls.Presentation, IdFTP,  IdFTPCommon, FMX.Objects, IOUtils;

type
TForm4 = class(TForm)
       Button1: TButton;
       Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form4: TForm4;

implementation

{$R *.fmx}

procedure TForm4.Button2Click(Sender: TObject);
var
F : TextFile;
sPath :String;
S : String;
begin
    sPath := TPath.Combine(TPath.GetDocumentsPath, 'Prueba.txt');
    AssignFile(F,sPath);
    Reset(F);                                                                             
    ReadLn(F,S);
       ShowMessage(S);
    CloseFile(F);
end;

procedure TForm4.Button1Click(Sender: TObject);
var
filename : String;
idFTP1 : TidFTP;
FS : TMemoryStream;
sPath :String;
begin
   FileName := '/Prueba.txt';
    sPath := TPath.Combine(TPath.GetDocumentsPath, 'Prueba.txt');
    IdFTP1 := TidFTP.Create(Nil);
    IdFTP1.Host := 'ftp.xxxxxx.com';
    IdFTP1.Username := 'xxxxxxxxxxx';
    IdFTP1.Password := 'xxxxxxxxxxxx';
    IdFTP1.Passive := True;
    IdFTP1.ConnectTimeout := 6000;
    Fs := TMemoryStream.Create;
    try
      IdFTP1.Connect;
      try
        IdFTP1.TransferType := ftBinary;
        IdFTP1.Get(FileName, FS);
        FS.Position := 0;
        FS.SaveToFile(sPATH);
      finally
        IdFTP1.Disconnect;
      end;

    finally
      Fs.Free;
    end;
 //if FileExists(sPath) then   ShowMessage('Existe');
 end;
end.

Saludos a todos.

Neftali [Germán.Estévez] 26-06-2017 09:12:25

Cita:

Empezado por jhonalone (Mensaje 518649)
El vídeo y el código.
Si no ganaste el concurso, por lo menos mereces un premio.^\||/^\||/^\||/

Pues sí lo gané :D:D, aunque todavía estoy esperando el premio... :(:(:(

Neftali [Germán.Estévez] 26-06-2017 09:13:43

Cita:

Empezado por jhonalone (Mensaje 518681)
Os dejo la solución que me ha funcionado a mí

^\||/^\||/ Gracias.

jhonalone 26-06-2017 10:03:14

¡¡Enhorabuena, Neftalí!!
Hubiera sido injusto que no lo ganaras. Lo merecías.
Un saludo.


La franja horaria es GMT +2. Ahora son las 09:10:43.

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