Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-09-2006
Avatar de KeyMan
KeyMan KeyMan is offline
Miembro
 
Registrado: oct 2005
Posts: 32
Poder: 0
KeyMan Va por buen camino
Realizar una conexion FTP mediante Delphi

Hola gente tengo que realizar una aplicación que me han pedido, para subir imagenes a un servidor mediante FTP. Dispongo de la versioón Delphi 7 y me gustaría saber por donde empezar.


He oido algo de un componente NMFTP pero no lo encuentro en mi Delphi 7.

Sabeis algo del tema o pensais que hay otra manera más sencilla.

Gracias
__________________
Saludos.. KeyMan
Responder Con Cita
  #2  
Antiguo 01-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Podrías probar con las componentes Indy, en particular la TIdFTP. También puedes usar WinInet. Si no mal recuerdo, el compañero seoane ha publicados varios ejemplos de uso. Si no, siempre está La Web de JM, que en su sección de Delphi trae una serie excelente de artículos acerca de WinInet, y en particular, su uso con FTP.

// Saludos
Responder Con Cita
  #3  
Antiguo 01-09-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Roman de Ftp todavía no había puesto ningún ejemplo, pero lo puedo intentar. La siguiente función sube un archivo a un servidor FTP.

Código Delphi [-]
Uses WinInet;

function Upload(LocalFile, RemoteFile, Server: string; Port: Word;
  Username, Password: PChar): Boolean;
var
  hNet: HINTERNET;
  hCon: HINTERNET;
  Context: DWORD;
begin
  Result := FALSE;
  Context:= 0;
  hNet := InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hNet <> nil) then
  begin
    hCon:= InternetConnect(hNet,PChar(Server),Port,Username,Password,
      INTERNET_SERVICE_FTP,0,Context);
    if (hCon <> nil) then
    begin
      Result:= FtpPutFile(hCon,PChar(LocalFile),PChar(RemoteFile),
        FTP_TRANSFER_TYPE_BINARY, Context);
      InternetCloseHandle(hCon);
    end;
    InternetCloseHandle(hNet);
  end;
end;

//Ejemplo de como usarla
Upload('C:\Foto.jpg','Carpeta/Foto.jpg','127.0.0.1',21,'Usuario','');

Los parámetros son: el archivo local, el archivo remoto (el que se va a crear), la dirección del servidor (el nombre o la ip), Usuario y password. Los parámetros Usuario y Password son PChar, así que si quieres usar una variable de tipo string tendrás que hacer el conveniente typecast ( PChar(variable) ), si por el contrario quieres hacer una conexión anónima utiliza nil en ambos parámetros.

Ahora es cuando comenzamos a complicar la cosa, en vez de mandar un archivo vamos a mandar una imagen. De echo vamos a capturar la pantalla y subir la imagen al ftp, algo así como un pequeño espía.

Código Delphi [-]
uses Windows, SysUtils, Classes, Graphics, Jpeg, WinInet;

function UploadScreen(Server: string; Port: Word; Username, Password: PChar): Boolean;
var
  hNet: HINTERNET;
  hCon: HINTERNET;
  hFile: HINTERNET;
  Context: DWORD;
  Bmp: Tbitmap;
  Jpg: TJPEGImage;
  Mem: TMemoryStream;
  Escritos: Cardinal;
begin
  Result := FALSE;
  Context:= 0;
  hNet := InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hNet <> nil) then
  begin
    hCon:= InternetConnect(hNet,PChar(Server),Port,Username,Password,
      INTERNET_SERVICE_FTP,0,Context);
    if (hCon <> nil) then
    begin
      hFile:= FtpOpenFile(hCon,PChar(FormatDateTime('ddmmyyhhnnss',Now)+'.jpg'),GENERIC_WRITE,
        FTP_TRANSFER_TYPE_BINARY,Context);
      if (hFile <> nil) then
      begin
        Bmp:= Tbitmap.Create;
        Jpg:= TJPEGImage.Create;
        Mem:= TMemoryStream.Create;
        try
          try
            bmp.Width:= GetSystemMetrics(SM_CXSCREEN);
            bmp.Height:= GetSystemMetrics(SM_CYSCREEN);
            BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,GetDc(0),0,0,SRCCOPY);
            jpg.Assign(bmp);
            jpg.CompressionQuality:= 60;
            jpg.Compress;
            jpg.SaveToStream(Mem);
            if InternetWriteFile(hFile,Mem.Memory,Mem.Size,Escritos) then
              Result:= Mem.Size = Escritos
            else
              Result:= FALSE;
          except end;
        finally
          Mem.Free;
          Bmp.free;
          Jpg.free;
        end;
        InternetCloseHandle(hFile);
      end;
      InternetCloseHandle(hCon);
    end;
    InternetCloseHandle(hNet);
  end;
end;


//Un ejemplo de como usarla
var
  Usuario: string;
  Password: string;
begin
  Usuario:= 'Miron';
  Password:= '';
  UploadScreen('127.0.0.1',21,PChar(Usuario),PChar(Password));
end;

Con esto ya se puede espiar a un incauto, solo hace falta convencerlo de que ejecute el programa, lo desbloquee en el firewall de windows y que no tenga otro firewall instalado. En serio, espiar a la gente es una cosa muy fea así que no lo hagáis

Última edición por seoane fecha: 02-09-2006 a las 02:47:48.
Responder Con Cita
  #4  
Antiguo 07-11-2006
JuanErasmo JuanErasmo is offline
Miembro
 
Registrado: ago 2005
Posts: 544
Poder: 19
JuanErasmo Va por buen camino
NO me funciona en Builder...

HOla amigos...ya me he vuelto un experto en traducir de Delphi a builder...
pero en este caso me sale un error extraño...esos de linker...
en la primera parte para subir un archivo a un servidor ftp me sale cuando compilo :
Código:
[Linker Error] Unresolved external 'InternetOpenA' referenced from C:\ARCHIVOS DE PROGRAMA\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'InternetConnectA' referenced from C:\ARCHIVOS DE PROGRAMA\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
es como si no lo reconociera...alguien sabe que pasa? o como arreglarlo? Gracias.
Responder Con Cita
  #5  
Antiguo 08-11-2006
JuanErasmo JuanErasmo is offline
Miembro
 
Registrado: ago 2005
Posts: 544
Poder: 19
JuanErasmo Va por buen camino
hCon me devuelve NULL

hola amigos...estoy intentando traducir ese codigo a a C++ Builder pero en una parte no me funciona.....cuando llamo a InternetConnect, la funcion me devuelve NULL....que estoy haciendo mal??
aca esta la linea de codigo
Código:
 hCon= InternetConnect(hNet,Server.c_str(),(14147),"usuario1","1234",
        INTERNET_SERVICE_FTP,0,Context);
....en hNet si tengo un valor no nulo, pero despues de esto...sihCon queda Null...Server es el contenido de un Edit1->Text, 14147 es el puerto, usuario el login y 1234 la contraseña.....estan bien ingresados los datos????
no me funciona....
Gracias si alguien sabe como arreglar esto muchas gracias
Responder Con Cita
  #6  
Antiguo 08-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Vamos por partes. Server.c_str() es el contenido de un Edit, pero no dices que has escrito en el Edit También seria interesante saber que dice windows que esta fallando. Utiliza la funciones GetLastError, e incluso InternetGetLastResponseInfo para obtener información sobre el fallo. En resumen ¿que hay en el Edit? ¿que código te devuelve GetLastError?
Responder Con Cita
  #7  
Antiguo 08-11-2006
JuanErasmo JuanErasmo is offline
Miembro
 
Registrado: ago 2005
Posts: 544
Poder: 19
JuanErasmo Va por buen camino
Gracias seaone

En Server esta el contenido de un Edit1->Text = ftp://localhost...
el codigo que estoy utilizando es el siguiente...:
Código:
 HINTERNET hNet,hCon;
   DWORD Context=0;
   hNet = InternetOpen("agent",INTERNET_OPEN_TYPE_PRECONFIG, NULL,    NULL, 0);
     AnsiString LocalFile = Edit1->Text;   // Edit1->Text = "C:\\Captura.jpg"
   AnsiString RemoteFile = Edit2->Text; // Edit2->Text = "Capturaftp.jpg"

   AnsiString Server = "ftp://localhost";
   HResult Result;

           hCon= InternetConnect(hNet,Server.c_str(),(14147),"usuario1","1234",
        INTERNET_SERVICE_FTP,0,Context);
 
          Result = FtpPutFile(hCon,(LocalFile).c_str(),(RemoteFile).c_str(),
        FTP_TRANSFER_TYPE_BINARY, Context);
        InternetCloseHandle(hCon);

cuando invoco hcon queda en Null....estoy utilizando filezilla Server que usa el puerto 14147..
Muchas gracias. en cuanto a lo del GetLast error....no se como usarlo...solo debugeo..para darme cuenta del error...y se que como hcon es un handle..no puede ser NULL...ahi esta el error...gracias amigo
Responder Con Cita
  #8  
Antiguo 08-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Prueba usando "localhost" o "127.0.0.1" en vez de "ftp://localhost/", fíjate que lo que se pide es solo el nombre del servidor no una URL que es lo que tu le pasas.
Responder Con Cita
  #9  
Antiguo 08-11-2006
JuanErasmo JuanErasmo is offline
Miembro
 
Registrado: ago 2005
Posts: 544
Poder: 19
JuanErasmo Va por buen camino
sigue sin funcionar...

No..no funciona tampoco...ahorita si se tarda mas pero no funciona...no hace la transferencia....
ves algo ams extraño en el codigo???
Gracias
Responder Con Cita
  #10  
Antiguo 08-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
El puerto 14147 en el Filezilla, por defecto, no es utilizado para realizar la conexión ftp sino para administrar el servidor. Si no me equivoco para el ftp usa el puerto 21, otra vez por defecto, así que si no has especificado algo diferente a la hora de instalar el programa, el puerto que deberías de utilizar es el 21 y no el 14147.
Responder Con Cita
  #11  
Antiguo 08-11-2006
JuanErasmo JuanErasmo is offline
Miembro
 
Registrado: ago 2005
Posts: 544
Poder: 19
JuanErasmo Va por buen camino
Exacto!!! eso era!

Gracias seaone! eso era! como siempre tu ayuda es muy oportuna.
Estuve revisando el filezilla y me dice que para administrador es el puerto 14147, pero para usuarios es el puerto 21, como estáandar!!!
gracias! me has ayudado mucho! tambien pudiste cambiar el icono de las ventanas...etc...eres de lo que mas sabe por estos lados.
Gracias.
Responder Con Cita
  #12  
Antiguo 08-11-2006
JuanErasmo JuanErasmo is offline
Miembro
 
Registrado: ago 2005
Posts: 544
Poder: 19
JuanErasmo Va por buen camino
otra preguntilla....

Como puedo obtener el listado de directorios en el servidor?
Para visualizarlo como en un Directory List Box? o en un List Box?
Gracias.
Responder Con Cita
  #13  
Antiguo 08-11-2006
JuanErasmo JuanErasmo is offline
Miembro
 
Registrado: ago 2005
Posts: 544
Poder: 19
JuanErasmo Va por buen camino
Como crear una carpeta en el servidor??

Como creo una carpeta en el servidor?
Tengo muchas dudas con esto del ftp....es la manera correcta de transferir archivos? o ya va a entrar en desuso??
Gracias
Responder Con Cita
  #14  
Antiguo 08-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Para listar los directorios, otra vez mas, te dejo el codigo en delphi

Código Delphi [-]
procedure Listar(Server: string; Port: Word;Username, Password: PChar);
var
  hNet: HINTERNET;
  hCon: HINTERNET;
  hFind: HINTERNET;
  Context: DWORD;
  Data: WIN32_FIND_DATA;
begin
  Context:= 0;
  hNet := InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hNet <> nil) then
  begin
    hCon:= InternetConnect(hNet,PChar(Server),Port,Username,Password,
      INTERNET_SERVICE_FTP,0,Context);
    if (hCon <> nil) then
    begin
      hFind:= FtpFindFirstFile(hCon,nil,Data,0,Context);
      if hFind <> nil then
      begin
        repeat
          if (Data.dwFileAttributes and faDirectory) = faDirectory then
          begin
            // Aqui muestro el nombre del directorio, tu puede hacer lo que quieras con el
            ShowMessage(Data.cFileName);
          end;
        until not InternetFindNextFile(hFind,@Data);
        InternetCloseHandle(hFind);
      end;
      InternetCloseHandle(hCon);
    end;
    InternetCloseHandle(hNet);
  end;
end;

En cuanto a si el ftp esta "de moda" o no, no soy quien para contestarte. Yo lo veo perfectamente valido para subir ficheros a un servidor. Claro que hay otros métodos para transferir archivos (p2p, carpetas compartidas, http ...) todos tienen sus ventajas y sus inconvenientes, eso depende mucho de cada caso.
Responder Con Cita
  #15  
Antiguo 08-11-2006
JuanErasmo JuanErasmo is offline
Miembro
 
Registrado: ago 2005
Posts: 544
Poder: 19
JuanErasmo Va por buen camino
Muy Bien

Ya convertí a C++ Builder y me funciono perfecto, pero solo me muestra los archivos y carpetas que estan en la "carpeta de entrada", no me muestra los archivos que estan en subcarpetas y demas....como hago que me muestre las subcarpetas?
Gracias!
Responder Con Cita
  #16  
Antiguo 08-11-2006
JuanErasmo JuanErasmo is offline
Miembro
 
Registrado: ago 2005
Posts: 544
Poder: 19
JuanErasmo Va por buen camino
Obterner el listado de una subcarpeta.

Hola otra vez....este codigo funciona para la lista del directorio root, pero si yo quiero "navegar" por ese listado...como hago para obtener la lista pero dentro de los subdirectorios? ya se como cambiar de directorio con FTPSetCurrentDirectory, pero no se como ejecutar para obtener el listado...
Gracias..si sabes como hacerlo te lo agradeceria.
Responder Con Cita
  #17  
Antiguo 08-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
El código tal cual te lo puse lista el contenido del directorio actual, así que si cambias el directorio actual, listara el contenido del nuevo directorio actual. De todas formas puedes especificar la ruta a listar:

Código Delphi [-]
procedure Listar(Server: string; Port: Word;Username, Password: PChar);
var
  hNet: HINTERNET;
  hCon: HINTERNET;
  hFind: HINTERNET;
  Context: DWORD;
  Data: WIN32_FIND_DATA;
begin
  Context:= 0;
  hNet := InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hNet <> nil) then
  begin
    hCon:= InternetConnect(hNet,PChar(Server),Port,Username,Password,
      INTERNET_SERVICE_FTP,0,Context);
    if (hCon <> nil) then
    begin
      //FtpSetCurrentDirectory(hCon,'/123'); // Con esto cambiariamos el directorio actual
      hFind:= FtpFindFirstFile(hCon,'/123/*',Data,0,Context); // < -- Fijate que digo que liste el directorio /123
      if hFind <> nil then
      begin
        repeat
          // Si quieres listar archivos ademas de directorio basta con eliminar esta linea
          //if (Data.dwFileAttributes and faDirectory) = faDirectory then
          //begin
            // Aqui muestro el nombre del directorio, tu puede hacer lo que quieras con el
            ShowMessage(Data.cFileName);
          //end;
        until not InternetFindNextFile(hFind,@Data);
        InternetCloseHandle(hFind);
      end;
      InternetCloseHandle(hCon);
    end;
    InternetCloseHandle(hNet);
  end;
end;
Responder Con Cita
  #18  
Antiguo 27-12-2006
JuanErasmo JuanErasmo is offline
Miembro
 
Registrado: ago 2005
Posts: 544
Poder: 19
JuanErasmo Va por buen camino
Crear carpeta que no existe en el ftp...

hola otra vez...
soy yo, de nuevo con el ftp, ya subo un archivo a mi servidor, pero ahora quiero crear un directorio en mi servidor ftp...
como se hace? que instruccion le aplico?
Gracias!
Responder Con Cita
  #19  
Antiguo 27-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por JuanErasmo
que instruccion le aplico?
FtpCreateDirectory
Responder Con Cita
  #20  
Antiguo 30-05-2007
JuanErasmo JuanErasmo is offline
Miembro
 
Registrado: ago 2005
Posts: 544
Poder: 19
JuanErasmo Va por buen camino
Como saber si si llego el archivo al servidor ftp?

Hola amigos,
En este hilo se envia un archivo ftp, perooooooooooo si el archivo se interrumpe en la subida, y la creacion no es completa, como verificar si el archivo llego?

Lo que pasa es que estoy enviando una serie de archivos y tengo que verificar que todos leguen a su destino....alguna idea de como hacerlo?
Gracias!
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
conexion mediante ODBC a la base de datos mysql, por linea de codigo de delphi sakuragi Conexión con bases de datos 21 15-03-2005 18:43:59
Conexion mediante ODBC, OLE DB, ADO? tsomarp Conexión con bases de datos 1 25-02-2005 13:05:27
Conexion con Oracle mediante ADO PTW Oracle 0 21-02-2005 14:50:25
Conexion a Access Mediante una DLL Draco Conexión con bases de datos 0 29-04-2004 04:27:47
Conexion a DBF mediante DBE Celta777 Conexión con bases de datos 2 18-10-2003 19:59:52


La franja horaria es GMT +2. Ahora son las 03:39:50.


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