Hallo,
ich habe einen Webserver mittels IdHttpServer (
Indy 10). Dieser soll es nun auch ermöglichen Dateiuploads von der Website aus zu tätigen (Anhänge zu einer E-Mail hinzufügen). Auf der Website habe ich also ein <input type=file> und dem IdHttpServer gebe ich im Event CreatePostStream einen PostStream mit.
Nun landet auch der gesamte POST-Content in diesem Stream. Leider aber als MIME multipart. So habe ich zum einen die Werte meiner sonstigen Parameter nicht mehr (ARequestInfo.Params ist leer) und zum Anderen komme ich auch nicht so leicht an die Datei die hochgeladen wurde.
Ein Beispiel für den POST-Content:
Code:
-----------------------------22813951414309'#$D#$A'Content-Disposition: form-data; name="receive"'#$D#$A#$D#$A'dfsddf'#$D#$A'-----------------------------22813951414309'#$D#$A'Content-Disposition: form-data; name="receivecc"'#$D#$A#$D#$A#$D#$A'-----------------------------22813951414309'#$D#$A'Content-Disposition: form-data; name="receivebcc"'#$D#$A#$D#$A#$D#$A'-----------------------------22813951414309'#$D#$A'Content-Disposition: form-data; name="subject"'#$D#$A#$D#$A#$D#$A'-----------------------------22813951414309'#$D#$A'Content-Disposition: form-data; name="text"'#$D#$A#$D#$A#$D#$A'-----------------------------22813951414309'#$D#$A'Content-Disposition: form-data; name="file"; filename="Adresse.pdf"'#$D#$A'Content-Type: application/pdf'#$D#$A#$D#$A'%PDF-1.4 ...
Als einzigen Hinweis im WWW habe ich bislang TIdMessageCoderMIME gefunden. Auch ein kleines Beispiel
hier. Dieses Beispiel ist allerdings noch mit einer älteren
Indy-Version als meiner gemacht und funktioniert so nicht. Ich habe bereits einiges umgebaut, so dass ich an den Content komme, dieser ist allerdings fehlerhaft, da irgendwo auf dem Weg in der Datei alle 0D oder 0A zu 0D0A werden. Außerdem bekomme ich über diesen Weg auch die anderen Parameter nicht so raus, da er die Namen der Parameter verwirft.
Ich frage mich, ob nicht schon viele andere dieses Problem gehabt haben müssen. Im Netz ist nur leider nichts konkretes zu finden. Ich hoffe jemand von euch weiß Rat, dafür muss es doch eine Lösung geben ...
Hier noch mein bisheriger Code:
Delphi-Quellcode:
procedure CHttpServer.ParseMimeRequest(Stream: TStream; Params: TStrings; ContentType: String; UserId: Cardinal);
var
MsgEnd : Boolean;
Decoder : TIdMessageDecoder;
Tmp : String;
Dest : TIdStreamVCL;
IdStream : TIdStreamVCL;
begin
MsgEnd:=false;
Stream.Position:=0;
IdStream:=TIdStreamVCL.Create(Stream);
Decoder:=TIdMessageDecoderMIME.Create(nil);
try
TIdMessageDecoderMIME(Decoder).MIMEBoundary:=TIdMIMEBoundary.FindBoundary(ContentType);
Decoder.SourceStream:=IdStream;
Decoder.FreeSourceStream:=false;
Decoder.ReadLn;
repeat
Decoder.Headers.Clear;
Decoder.ReadHeader;
case Decoder.PartType of
mcptAttachment:
begin
Tmp:=ExtractFileName(Decoder.FileName);
Dest:=TIdStreamVCL.Create(TMemoryStream.Create,true);
try
Decoder.ReadBody(Dest,MsgEnd);
if Decoder.FileName<>'' then
begin
AddAttachment(UserId,TMemoryStream(Dest.VCLStream));
end;
finally
FreeAndNil(Dest);
end;
end;
end;
until (Decoder=nil) or MsgEnd or (Stream.Position>=Stream.Size);
finally
FreeAndNil(Decoder);
end;
end;
Gruß,
Steffen