Einzelnen Beitrag anzeigen

Benutzerbild von MasterEvil
MasterEvil

Registriert seit: 12. Feb 2005
Ort: Hannover
234 Beiträge
 
Delphi 7 Enterprise
 

Indy HTTPServer: Datei Upload

  Alt 15. Apr 2009, 14:32
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:
-----------------------------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 ...
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.

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:
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;
Gruß,
Steffen
  Mit Zitat antworten Zitat