Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-10-2007
lsg lsg is offline
Miembro
 
Registrado: jul 2006
Posts: 24
Poder: 0
lsg Va por buen camino
Question Upload de archivos en ISAPI, se puede ?

Estoy haciendo un webserver , o sea una Dll ISAPI con Delphi 7 y necesito que alguien me envie un archivo.

El tema es que ademas no puedo usar forms de HTML, ya que el webserver no sera visto desde una pagina html, sino que sera peticionada / accedida por una pocket pc. La cual llamara a la dll de la forma
//192.168.x.x/midll.dll?Dato1=ValorX&Dato2=ValorY

Mi idea seria que tambien me puedan hacer upload de archivos de la siguiente manera:
//192.168.x.x/midll.dll?Dato1=ValorX&Dato2=ValorY&FileToUpload=C:\prueba.txt

Es esto posible ?

Si es asi, como capturo o leo este archivo desde mi dll ?

Alguien puede ayudarme ?

Gracias

Última edición por lsg fecha: 03-10-2007 a las 21:37:33.
Responder Con Cita
  #2  
Antiguo 03-10-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
ISAPI????????, aún existe?, :O
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #3  
Antiguo 05-10-2007
lsg lsg is offline
Miembro
 
Registrado: jul 2006
Posts: 24
Poder: 0
lsg Va por buen camino
En el mundo , todavia hay gente programando con delphi 5 ,6 , 7....
Incluso Con visual basic, Fox Pro, Clipper, etc.

por que deberia desaparecer la ISAPI ?


Por favor, necesito respuestas que me ayuden.

Gracias
Responder Con Cita
  #4  
Antiguo 05-10-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 17
rolandoj Va por buen camino
Smile Es perfectamente posible

Hola,

Yo tengo desarrollada con Delphi 4 e Indy una aplicación entre cuya funcionalidad está exactamente ese Upload como lo necesitas. Esta tarde estoy ocupado; pero a la noche te escribo un ejemplo en código Delphi
Responder Con Cita
  #5  
Antiguo 06-10-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 17
rolandoj Va por buen camino
Smile El código en el servidor ISAPI

Hola,

Perdón por la demora; pero anoche llegué muy tarde.

Como te dije, yo tengo funcionando una aplicación que hace la carga exactamente como la necesitas. Está desarrollada en Delphi 4 con Indy 8.

El secreto del asunto está en la técnica para MultiForms; es decir,
enviar al servidor, en un solo requerimiento, tanto datos simples,
como un código o un nombre, junto con uno o más archivos.

En el caso del servidor, necesitaremos tener disponible la clase
TMsMultipartFormParser. Esta clase la encuentras en la unidad
MsMultipartParser. No recuerdo bien si esa unidad viene con Indy 8 o si la bajé de otro sitio de Internet; pero puedes buscarla con Google.

Con eso en mente, ubiquemonos en el TWebModule (que en el ejemplo que
te doy es dmServidor). Agrega una acción llamada EscArchivo, en ella
deberás escribir un código como el siguiente:

Código Delphi [-]
procedure TdmServidor.dmServidorEscArchivoAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled:Boolean);
Var
   TheCode:             String;
   TheParser:           TMsMultipartFormParser;
begin
     TheParser := TMsMultipartFormParser.Create;
     Try
        TheParser.Parse(Request);
        TheCode := TheParser.ContentFields.Values['CODE'];
        GrabarArchivo(TheCode,TheParser.Files[0].FileData);
     Finally
        TheParser.Free;
     End;
end;

Logicamente, este es un ejemplo sencillo que no incluye el control de errores que debes tener en la realidad.

Vayamos por partes para entender este código.

Como es normal, el parámetro Request trae la totalidad de la petición
hecha por el cliente (ya veremos como se construye). El método Parse
se encarga de descomponer ese requerimiento de forma que otras
propiedades de nuestro objeto clave puedan acceder directamente a sus
valores.

La propiedad ContentFields es la que tiene los campos "normales"; en
el ejemplo, estamos cargando un archivo a una base de datos, y el
parámetro CODE nos sirve para identificarla ahí.

Los archivos están en la propiedad Files, esta se indexa por número
de archivo desde 0, así que como estamos subiendo solo uno, usamos
Files[0]. Cada item de esta propiedad es un objeto del tipo THTTPFile
y la propiedad FileData de ellos es un TStream conteniendo al archivo
en sí; de esta forma, cuando llamamos al método GrabarArchivo, ese sí
desarrollado por nosotros, le estamos pasando tan solo el código que
necesitamos para identificar el archivo y el archivo en sí, en formato
TStream (que es una clase implementada por Delphi), de ahí en
adelante si es solo Delphi puro.

Un poco más tarde te describo la parte del cliente; ya que como supondrás, no es tan simple como lo planteas en tú ejemplo.

Suerte
Responder Con Cita
  #6  
Antiguo 06-10-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 17
rolandoj Va por buen camino
Smile La parte del cliente

Hola,

Para la parte del cliente, tenemos un TDatamodule (en nuestro ejemplo dmWeb), con el componente Indy, TIdHTTP (en nuestro ejemplo ElHTTP).
El punto clave es la clase TMsMultiPartFormDataStream de la unidad MsMultiPartFormData. Tampoco recuerdo si viene con Indy 8; pero si tienes algún problema para localizar estas unidades, avisame.

Esta clase permite armar un mensaje compuesto, agregando tanto campos simples, como archivos.

El siguiente código ilustra la técnica:

Código Delphi [-]
Procedure TdmWeb.GrabarArchivo(AnURL,ACode,AFileName:String);
Var
   ResponseStream:      TMemoryStream;
   MultiPartFormDataStream: TMsMultiPartFormDataStream;
Begin
     MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;
     ResponseStream          := TMemoryStream.Create;
     try
        ElHTTP.Request.ContentType := MultiPartFormDataStream.RequestContentType;
        { Agrega uno o más campos simples }
        MultiPartFormDataStream.AddFormField('CODE', ACode);
        { Agrega uno o más archivos }
        MultiPartFormDataStream.AddFile('Archivo', AFileName, 'image/dwf');
        { Es necesario hacer esta inicialización antes de enviar el stream }
        MultiPartFormDataStream.PrepareStreamForDispatch;
        MultiPartFormDataStream.Position := 0;
        { Ahora sí se envía la petición  }
        ElHTTP.Post(AnURL,MultiPartFormDataStream, ResponseStream);
     finally
        MultiPartFormDataStream.Free;
        ResponseStream.Free;
     end;
End;

Los puntos a resaltar son los siguientes:

El parámetro AnURL es solo el DLL y la acción requerida, sin parámetros simples. En nuestro ejemplo, algo como :

http://192.168.x.x/midll.dll/EscArchivo

El tipo de contenido para la propiedad Request del TidHTTP debe indicar multiforms y eso se hace tomandolo del TMsMultiPartFormDataStream
Cada campo simple se agrega con el método AddFormField, que recibe 2 parámetros : El nombre del campo y su valor

Cada archivo se agrega con el método AddField. El primer parámetro indica el nombre que puedes usar en el servidor para identificar dicho archivo. En el ejemplo que puse, a efectos de ilustración, como es un solo archivo, a efectos de identificarlo en el servidor usé el campo CODE y no este parámetro. El segundo parámetro es el camino completo al archivo en el cliente. El último parámetro es el tipo de contenido del archivo que se agrega. Este parámetro es importante, indicar el contenido equivocado puede causar la falla de la carga. En el ejemplo, estoy subiendo un archivo en formato dwf (el plano de una construcción generado por Autocad)

Finalmente, como ves en los comentarios, son necesarias las dos instrucciones de inicialización antes de ejecutar el Post.

Suerte
Responder Con Cita
  #7  
Antiguo 09-10-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 17
rolandoj Va por buen camino
Question Como te fuè ?

Hola,

Cuentame si te funcionò la soluciòn
Responder Con Cita
  #8  
Antiguo 15-01-2008
veltran11 veltran11 is offline
Registrado
 
Registrado: dic 2007
Ubicación: Buenos Aires, Argentina
Posts: 3
Poder: 0
veltran11 Va por buen camino
Hola rolandoj.
Yo tenia el mismo requerimiento que lsg, e investigando por el foro encontre tu respuesta que me vino estupendamente.
La implemente, la probe y me funciono perfecto.

Ahora cuando yo lo trabajo en forma local funciona bien.
Cuando hago el post desde mi navegador de internet al servidor remoto funciona bien.
Pero cuando hago el post desde mi aplicacion de delphi al servidor remoto, me tira el siguiente error:
Socket Error # 10065
No route to host.


Quiero aclarar que estoy haciendo el requerimiento a un servidor con una ip dinamica (NO-IP) y mi el post cita de la siguiente manera:
Código:
Post('http://ventral.no-ip.biz/ruta/cgi.exe/login',mList);
Si alguien tiene alguna idea de que es lo que puede estar pasando agradeceria el comentario.

Saludos.

Última edición por veltran11 fecha: 15-01-2008 a las 16:20:39.
Responder Con Cita
  #9  
Antiguo 15-01-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 17
rolandoj Va por buen camino
No uses CGI

Hola,

Me encuentras ocupado; pero a la noche trataré de ayudarte.
Por favor envíame más información; por ejemplo, cual es el servidor que estás usando (Omni, IIS ?)

He tenido problemas con sockets; pero, no recuerdo si alguno era ese mensaje. Hay varias posibles causas. Por ahora, te sugiero buscar en Internet el mensaje exacto y revisar lo más obvio, que a veces se nos olvida porque nos confiamos y creemos que esas partes están bien; o sea, ver que el servidor esté arriba, que permita la ejecución del software servidor, y que su dirección sea efectivamente accesible por internet.

Te sugiero esto último porque intenté llamar la página desde Internet explorer y no pudo cargarla; me devolvió error. Es posible que en ese momento tú servidor estuviera abajo; pero, también es posible que debido a enrutamiento hayas pensado que desde tú navegador estabas llamado la versión del servidor cuando en realidad estabas llamando la local.

De todas formas, hay algo crítico que no deberías hacer y es usar CGI. No sé hasta que punto pueda ser causa del error; pero no sería de extrañar. Yo uso librerías ISAPI; con las DLL, salvo algunos problemas mientras tomabamos experiencia, en general me ha ido muy bien. Emplear ejecutables genera un alto consumo de recursos en el servidor.

Suerte

Cita:
Empezado por veltran11 Ver Mensaje
Hola rolandoj.
Yo tenia el mismo requerimiento que lsg, e investigando por el foro encontre tu respuesta que me vino estupendamente.
La implemente, la probe y me funciono perfecto.

Ahora cuando yo lo trabajo en forma local funciona bien.
Cuando hago el post desde mi navegador de internet al servidor remoto funciona bien.
Pero cuando hago el post desde mi aplicacion de delphi al servidor remoto, me tira el siguiente error:
Socket Error # 10065
No route to host.

Quiero aclarar que estoy haciendo el requerimiento a un servidor con una ip dinamica (NO-IP) y mi el post cita de la siguiente manera:
Código:
Post('http://ventral.no-ip.biz/ruta/cgi.exe/login',mList);
Si alguien tiene alguna idea de que es lo que puede estar pasando agradeceria el comentario.

Saludos.
Responder Con Cita
  #10  
Antiguo 15-01-2008
veltran11 veltran11 is offline
Registrado
 
Registrado: dic 2007
Ubicación: Buenos Aires, Argentina
Posts: 3
Poder: 0
veltran11 Va por buen camino
rolandoj:
En principio gracias por responder tan rapidamente.

A tu pregunta del servidor te cuento que estoy usando IIS.
Con respecto al cgi. Lo estoy haciendo en cgi por que me es mas facil depurarlo, pero mas adelante lo migrare a una libreria ISAPI (dll), como sugieres.

Aca te paso la url correcta:
http://veltran.no-ip.biz/impserver/impserver.exe/login
a lo que te respondera: Estado=NO EXISTE
Si a esto mismo lo llamo desde mi aplicacion en delphi y le agrego los parametros de usuario y contraseña me devuelve todos los datos del usuario en cuestion.
Lo que me parece raro es que a traves del explorer me lo devuelve bien pero si lo llamo desde mi aplicacion en delphi me tira el error que te mencione.
Aca te paso el codigo en delphi que hace el post:
Código:
procedure TForm1.Button1Click(Sender: TObject);
var
  HTTP:TIdHttp;
  mList:TStringList;
  mIp,mResp:String;
begin
  HTTP:=TIdHTTP.Create(nil);
  mList:=TStringList.Create;
  mList.Add('Clave=7A159C97AC1A3187BA124AB27DC3C9E6');
  mResp:=HTTP.Post('http://veltran.no-ip.biz/impserver/impserver.exe/login',mList);
  ShowMessage(mResp);
  mList.Free;
  HTTP.Free;
end;
Gracias nuevamente.

Saludos.

Última edición por veltran11 fecha: 15-01-2008 a las 19:26:11.
Responder Con Cita
  #11  
Antiguo 15-01-2008
veltran11 veltran11 is offline
Registrado
 
Registrado: dic 2007
Ubicación: Buenos Aires, Argentina
Posts: 3
Poder: 0
veltran11 Va por buen camino
Hola a todos.

Para el que le pueda llegar a interesar ya pude solucionar mi problema.

Yo queria hacer un post con el componente IdHTTP de indy y podia hacerlo correr en forma local pero no lo podia hacerlo desde otra maquina.
El problema era que lo estaba tratando de correr desde una maquina en una red de una empresa que tenia configurado el proxy. Asi que lo que hice fue setear lo siguiente del componente IdHTTP:
ProxyParams.ProxyPort:=8080
ProxyParams.ProxyServer:=El proxy que utiliza internet, que se puede obtener del explorador de internet -> herramientas -> opciones de internet -> conexiones -> configuracion lan

Nuevamente quiero agradecer a este foro y especialmente al usuario rolandoj que gracias a sus respuestas pude llegar a este resultado.

Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
ftp Upload / Download (Aplicación) seoane Internet 15 08-03-2008 16:24:37
upload masivo kayetano PHP 12 06-12-2006 17:45:39
UPLOAD de varios archivos por código HombreSigma .NET 3 04-12-2005 16:23:07
no se puede enviar por mail archivos pdf? jpcancino Internet 6 10-03-2004 16:57:48
como upload una bB.D. bdf con un form kassel PHP 4 22-01-2004 22:01:55


La franja horaria es GMT +2. Ahora son las 20:43:57.


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