AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Indy HTTPServer Datei Upload über PostStream und TIdMessageDecoderMIME Buggy
Thema durchsuchen
Ansicht
Themen-Optionen

Indy HTTPServer Datei Upload über PostStream und TIdMessageDecoderMIME Buggy

Ein Thema von paresy · begonnen am 18. Jun 2010 · letzter Beitrag vom 5. Nov 2010
Antwort Antwort
paresy

Registriert seit: 24. Aug 2004
Ort: Lübeck
105 Beiträge
 
Delphi 2007 Professional
 
#1

Indy HTTPServer Datei Upload über PostStream und TIdMessageDecoderMIME Buggy

  Alt 18. Jun 2010, 11:19
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
  Mit Zitat antworten Zitat
fred.ahrens

Registriert seit: 11. Aug 2007
Ort: Ketzin/Havel
45 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Indy HTTPServer Datei Upload über PostStream und TIdMessageDecoderMIME Buggy

  Alt 5. Nov 2010, 09:23
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).
Fred Ahrens (ZeeBORN GmbH)

Geändert von fred.ahrens ( 5. Nov 2010 um 10:12 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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