Los rincones del API Win32: WinInet y FTP - Descarga y envío de archivos

12 - Descarga y envío de archivos

[editar]
Tutorial creado por Juan Manuel. Extraido de: http://www.lawebdejm.com
30 de Noviembre de 1999
Como es lógico, la tarea más importante a la hora de conectarse a un servidor FTP es la descarga y envío de archivos, y ahora que ya sabemos renombrar, mover y eliminar archivos, podemos centrarnos en esta parte del protocolo FTP.

Tanto la descarga como en envío podemos realizarlos de dos formas, una directa (con una única llamada a una función) y otra al estilo de la lectura de archivos locales: con apertura, lectura y cierre del fichero.

La descarga con el método directo puede hacerse a través de la función FtpGetFile:

BOOL FtpGetFile( HINTERNET hConexión, LPCTSTR lpszArchivoRemoto, LPCTSTR lpszArchivoLocal, BOOL fErrorSiExiste, DWORD dwAtributos, DWORD dwOpciones, DWORD_PTR dwContexto );

  • hConexión: un descriptor de conexión obtenido a través de InternetConnect.
  • lpszArchivoRemoto: un puntero a una cadena en la que se pasa el nombre del archivo remoto que queremos descargar. Se puede incluir la ruta absoluta o relativa.
  • lpszArchivoLocal: un puntero a una cadena en la que se pasa el nombre del archivo local donde se almacenará el contenido del archivo remoto. Se puede incluir la ruta absoluta o relativa.
  • fErrorSiExiste: indica si la función fallará si el archivo local ya existe, o si el archivo local debe ser sobrescrito.
  • dwAtributos: indica el conjunto de atributos que se establecerá al archivo local. Se puede incluir cualquier valor de los admitidos por el atributos dwFileAttributes, dentro de la estructura WIN32_FIND_DATA (que ya hemos explicado anteriormente).
  • dwOpciones: indica el conjunto de opciones que controlan la descarga del archivo. Se puede utilizar cualquier combinación de los valores que explicamos para el parámetro dwOpciones de la función FtpOpenFile.
  • dwContexto: el valor de contexto que queramos pasar al llamar a la función de callback.

La función retorna TRUE o FALSE, dependiendo de su éxito o fracaso.




Por el otro lado, podemos realizar en envío de un fichero a un servidor FTP a través de la función FtpPutFile:

BOOL FtpPutFile( HINTERNET hConexión, LPCTSTR lpszArchivoLocal, LPCTSTR lpszArchivoRemoto, DWORD dwOpciones, DWORD_PTR dwContexto );

  • hConexión: un descriptor de conexión obtenido a través de InternetConnect.
  • lpszArchivoLocal: un puntero a una cadena en la que se pasa el nombre del archivo local que se quiere enviar al servidor. Se puede incluir la ruta absoluta o relativa.
  • lpszArchivoRemoto: un puntero a una cadena en la que se pasa el nombre del archivo remoto donde queremos almacenar la información a enviar. Se puede incluir la ruta absoluta o relativa.
  • dwContexto: el valor de contexto que queramos pasar al llamar a la función de callback.

La función retorna TRUE o FALSE, dependiendo de su éxito o fracaso.




Como dijimos antes, podemos descargar o enviar un archivo a través del método directo (con las funciones FtpGetFile y FtpPutFile) o bien hacerlo como si de un archivo local se tratase, siguiendo los siguientes pasos:

  1. Apertura del archivo origen y remoto. En caso de una descarga, el archivo origen será un archivo remoto, y el archivo destino, será uno local, creado vacío.
  2. Lectura del archivo origen mientras queden datos y grabación de los datos leídos en el archivo destino.
  3. Cierre del fichero origen y destino.

Para la apertura de archivos locales, podemos hacer uso de la función CreateFile, tal y como explicamos durante nuestro curso sobre “Archivos proyectados en memoria”. Si se trata de abrir un archivo un remoto en un servidor FTP, tenemos que hacer uso de la función FtpOpenFile, que hemos explicado en este mismo curso.

Para la lectura y grabación en archivos locales, tendremos que recurrir a las funciones ReadFile y WriteFile respectivamente, mientras que si se trata de leer o escribir en un archivo remoto, tenemos las funciones InternetReadFile e InternetWriteFile, que ya explicamos durante el curso “WinInet y HTTP”. Si estamos leyendo de un archivo remoto, es recomendable también utilizar la función InternetQueryDataAvailable, tal y como explicamos en el curso “Más sobre WinInet y HTTP”.

Este otro método, aunque más complejo y laborioso, es el recomendable a la hora de mostrar un indicador de progreso en la descarga de un archivo ya que podemos averiguar el tamaño total del archivo (con FtpGetFileSize) y controlamos completamente el proceso de lectura byte a byte del archivo remoto.

Hay que tener cuidado con este punto, ya que la apertura de archivos remoto requiere de conexiones a través puertos especiales. Si nuestra conexión a internet se hace a través de un cortafuegos o un servidor proxy, es muy posible que estas conexiones se dos denieguen. Para solucionar este problema debemos realizar la conexión siguiendo el modo pasivo, tal y como explicamos anteriormente.

No voy a explicar las funciones, ya que profundizamos en ellas cuando hablamos del protocolo HTTP (en los cursos que he indicado antes).
[editar]

12 opiniones

OTATO

MUY BUENA EXPLICACION.....
ME PARECIO EXCELENTE
AHORA SOLO KISIERA SABER COMO PONER MI CONEXION FTP DE MODO PASIVO.....SI NO ES MUCHO PEDIR
GRACIAS
Y MUY BUEN TRABAJO EH
OTATO

MUY BUENO EH
ME PARECE K ES EXCELENTE LA EXPLICACION DE ESTOS 2 PROTOCOLOS
ESTO ES BUENO CONOCER PARA TODOS
OTATO

PUES ESTA CHIDO LA EXPLICACION... PERO NO YO KISIERA SABER K PUERTO PUEDO ABRIR (K NO SEA EL 21) PARA MI SERVIDOR FTP
ESPERO ME AYUDEN CON ESO
DE ANTE MANO MUCHAS GRACIAS
Excelente aporte.

Es un tutorial muy bueno, y facil de entender.
Corrección.

En el punto 3. Del "modo pasivo" hay un error: 3. Para ciertas operaciones, es necesario realizar el envío de un fichero, por lo que se crea el canal de datos. Para ello el cliente crea una conexión física desde uno de sus puerto (puerto y) hasta un número de puerto del *cliente*. Este número de puerto fue el que indicó el servidor como respuesta del comando pasv (puerto z). De este modo, el cliente establece el canal de datos por el que se transmite la información. Donde dice *cliente* debería decir *servidor*.
1 2 3 | siguiente >

Tutoriales relacionados con 'Los rincones del API Win32: WinInet y FTP'

El protocolo FTP desde el API WinInet. Con este curso aprenderás a hacer un pequeño... Más »
Comienzo con un nuevo tema dentro dentro de la serie Los rincones del API Win32.... Más »
Entramos en temas interesantes: el acceso a recursos remotos a través del protocolo de aplicación... Más »
En el anterior curso dejamos muchos temas en el tintero, así que voy a terminar... Más »
Damos una visión detallada de una de las características más interesantes de esta tecnología de... Más »

Autor y licencia de 'Los rincones del API Win32: WinInet y FTP'


Tutorial de Juan Manuel. Extraido de: http://www.lawebdejm.com CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.