![]() |
Indy HTTPServer Datei Upload über PostStream und TIdMessageDecoderMIME Buggy
Ich versuche zur Zeit über den Indy HTTPServer einen Dateiupload auszuwerten. Habe dazu allerlei Beispiele und Quelltext im Netz durchsucht und die mir am besten bekannte Lösung ausprobiert. Jedoch gibt es das Problem, dass bei Binärdaten mehr Bytes in der Datei (Stream) landen, als versendet wurden. Bei Textdateien ist alles OK!
Hier ein ähnlicher Fall: ![]() Hier der Ursprung der Idee: ![]() Indy svn, rev #4262 Delphi 2007 Mein Upload File: HTML-Code:
<form enctype="multipart/form-data" action="/" method="POST">
Delphi-Quellcode:
Wäre für jeden Hinweis dankbar bevor ich anfange Indy Quellcode zu debuggen :)
procedure ProcessMultiPartData(ARequestInfo: TIdHTTPRequestInfo);
var Decoder: TIdMessageDecoderMIME; MsgEnd: Boolean; MemStream: TStream; FileStream: TFileStream; Boundary: String; begin if Pos('multipart/form-data', ARequestInfo.ContentType) > 0 then begin ARequestInfo.PostStream.Position := 0; Decoder := TIdMessageDecoderMIME.Create(nil); Decoder.SourceStream := ARequestInfo.PostStream; Decoder.FreeSourceStream := False; Boundary := ARequestInfo.ContentType; Boundary := MidStr(Boundary, Pos('boundary=', Boundary)+9, Length(Boundary)); Decoder.MIMEBoundary := Boundary; Decoder.ReadLn(); //kill boundary line //repeat... repeat Decoder.Headers.Clear; Decoder.ReadHeader; MemStream := TMemoryStream.Create; try Decoder.ReadBody(MemStream, MsgEnd); if (Decoder.Filename <> '') then begin FileStream := TFileStream.Create(Decoder.Filename, fmCreate); try MemStream.Position := 0; FileStream.CopyFrom(MemStream, MemStream.Size); finally FileStream.Free; end; end; finally MemStream.Free; end; until (MsgEnd or (Decoder.SourceStream.Position >= Decoder.SourceStream.Size)); end; end; procedure HTTPServerCommandGet(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); begin ... ProcessMultiPartData(ARequestInfo); ... end; Danke, paresy |
AW: Indy HTTPServer Datei Upload über PostStream und TIdMessageDecoderMIME Buggy
Hallo,
da sitzen wir auch gerade dran. Es sieht ganz danach aus, als ob IdMessageDecoderMime Probleme beim Extrahieren rein binärer Bestandteile hat. Beim Dekodieren werden Zeilenumbrüche erkannt, die keine sind und dann mit #$0a0d in die Zieldatei geschrieben. Wir suchen gerade Alternativen - entweder für die HTTP-Server-Komponenten der Indys oder aber für den Anfang auch nur eine Alternative für IdMessageDecoderMime. Wenn man etwas länger per Google sucht, findet man auch Hinweise, wie man die fehlerhaften Stellen in den Indy-Quellen fixen kann. Uns wird aber die Liste der selbstgefixten Bugs in den Indys langsam zu lang - und leider findet man dieses Fixes nicht unbedingt in den nächsten Releases der Indys wieder und fängt wieder von vorne an. Momentan testen wir IP*Works und ICS (Overbyte) als Alternativen. Gruß, Fred EDIT: Habe gerade gesehen, dass das bei den verlinkten Beiträgen auch schon erklärt wurde ... EDIT2: Update: ICS ( ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz