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;
MultiPartFormDataStream.AddFormField('CODE', ACode);
MultiPartFormDataStream.AddFile('Archivo', AFileName, 'image/dwf');
MultiPartFormDataStream.PrepareStreamForDispatch;
MultiPartFormDataStream.Position := 0;
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