Ver Mensaje Individual
  #6  
Antiguo 06-10-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Reputación: 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