Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Indy HTTPServer Datei Upload über PostStream und TIdMessageDecoderMIME Buggy (https://www.delphipraxis.net/152328-indy-httpserver-datei-upload-ueber-poststream-und-tidmessagedecodermime-buggy.html)

paresy 18. Jun 2010 11:19

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:
http://www.delphipraxis.net/902932-post.html

Hier der Ursprung der Idee:
http://groups.google.com/group/borla...ile+mime&pli=1

Indy svn, rev #4262
Delphi 2007

Mein Upload File:
HTML-Code:

<form enctype="multipart/form-data" action="/" method="POST">
Choose a file to upload: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>

Delphi-Quellcode:
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;
Wäre für jeden Hinweis dankbar bevor ich anfange Indy Quellcode zu debuggen :)

Danke,
paresy

fred.ahrens 5. Nov 2010 09:23

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 (http://www.overbyte.be) sieht sehr gut aus. Bei den Demos ist auch ein Webserver bei, bei dem u.a. auch der Fileupload demonstriert wird (und funktioniert).


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:24 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