Indy HTTPServer: Datei Upload
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:
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.
-----------------------------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 ...
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:
Gruß,
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; Steffen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz