Einzelnen Beitrag anzeigen

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