"Joe Aley" <
XXXX@XXXXX.COM>writes
Quote
<form enctype="multipart/form-data" action="upload" method="post">
You can use TIdMessageDecoderMIME to manually parse "multipart/form-data"
submissions. For example:
uses IdMessageDecoderMIME, IdMessage;
procedure TForm1.IdHTTPServer1CreatePostStream(AThread: TIdPeerThread;
var VPostStream: TStream);
begin
VPostStream := TMemoryStream.Create;
end;
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
S: String;
procedure DecodeFormData(const Header: String; ASourceStream:
TStream);
var
MsgEnd: Boolean;
Decoder: TIdMessageDecoder;
Tmp: String;
Dest: TStream;
begin
MsgEnd := False;
Decoder := TIdMessageDecoderMIME.Create(nil);
try
TIdMessageDecoderMIME(Decoder).MIMEBoundary :=
TIdMIMEBoundary.FindBoundary(Header);
Decoder.SourceStream := ASourceStream;
Decoder.FreeSourceStream := False;
Decoder.ReadLn;
repeat
Decoder.ReadHeader;
case Decoder.PartType of
mcptUnknown:
raise Exception('Unknown form data detected');
mcptText:
begin
Tmp :=
Decoder.Headers.Values['Content-Type'];
Dest := TMemoryStream.Create;
try
Decoder := Decoder.ReadBody(Dest,
MsgEnd);
if AnsiSameText(Fetch(Tmp, ';'),
'multipart/mixed') then
DecodeFormData(Tmp, Dest)
else
// use Dest as needed...
finally
FreeAndNil(Dest);
end;
end;
mcptAttachment:
begin
Tmp := ExtractFileName(Decoder.FileName);
if Tmp <>'' then
Tmp := 'c:\some folder\" + Tmp
else
Tmp := MakeTempFilename("c:\some
folder\");
Dest := TFileStream.Create(Tmp, fmCreate);
try
Decoder = Decoder.ReadBody(Dest,
MsgEnd);
finally
FreeAndNil(Dest);
end;
end;
end;
until (Decoder = nil) or MsgEnd;
finally
FreeAndNil(Decoder);
end;
end;
begin
S := ARequestInfo.Headers.Values['Content-Type'];
if AnsiSameText(Fetch(S, ';'), 'multipart/form-data') then
DecodeFormData(S, ARequestInfo.PostStream)
else
// use request data as needed...
end;
Gambit