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:
<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