Download TIdHTTPServer File

I am trying to upload files to Indy (version 10.5.5) TIdHTTPServer.
I was looking for solutions, but so far no luck that I found for older versions of Indy that were not compatible with the version that ships with Delphi 2010.

What I hope is to simply upload the file using "multipart / form-data" to the server and decode , just like that, any help is appreciated.

+6
source share
5 answers

I started xxm as a way to create sites with Delphi, as well as recompile scripts with HTML and Pascal code using the refresh button of the browser after the changes.

It uses a common interface that "connects" to IIS, Apache, Internet Explorer, FireFox, as well as a stand-alone HTTP exe. The interface provides an IxxmParameterPostFile parameter when loading a file.

See Demo 4 Download for an example.

+4
source

TIdHTTPServer does not currently support multipart/form-data views natively. This is indicated in the Indy 11 task list. At the same time, you must manually parse the published MIME data using TIdDecoderMIME , as suggested by mjn. There were examples of what was posted on the Embarcadero and Indy forums before.

+8
source

Only a suitable solution that I can find without personal testing (let me know if this does not lead you to a working solution for your needs, and I will run XE and produce something more eloquent)

+3
source

http://www.synaptica.info/2014/01/31/tidhttpserver-decode-content-type-multipartform-data/

I am doing a simple multi-page download as follows:

units used:

 interface uses System.SysUtils, System.Classes, Web.Win.Sockets, IdBaseComponent, IdComponent, IdCustomTCPServer, IdCustomHTTPServer, IdHTTPServer, IdContext, IdTCPServer,System.Generics.Collections, Data.DB, Datasnap.DBClient,IdHeaderList,idGlobal, IdIntercept,IdMessage,IdMessageCoderMIME,IdMessageCoder,IdGlobalProtocols; 

code that works in mime content:

 procedure TdmNet.IdHTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); Var ms : TMemoryStream; newdecoder, Decoder: TIdMessageDecoder; boundary, startboundary : String; msgEnd : Boolean; tmp : String; I : Integer; fname : String; tsValues : TStringList; begin i := 0; if pos('upload',lowercase(ARequestInfo.Document)) > 0 then begin If ARequestInfo.PostStream = nil then AResponseInfo.ContentText := '<HTML><BODY>unparsed:' + ARequestInfo.UnparsedParams + '<br>Encoding:' + ARequestInfo.ContentEncoding + ARequestInfo.RawHeaders.Values['Content-Type'] + '<br>HashCode:' + IntToStr(ARequestInfo.GetHashCode) + '<br>Params:' + ARequestInfo.Params.Text + ' -->stream nullo<br></BODY><HTML>' Else ARequestInfo.PostStream.Position := 0; msgEnd := False; boundary := ExtractHeaderSubItem(ARequestInfo.ContentType, 'boundary',QuoteHTTP); startboundary := '--' + boundary; repeat tmp := ReadLnFromStream(ARequestInfo.PostStream, -1, True); until tmp = startboundary; decoder := TIdMessageDecoderMIME.Create(nil); TIdMessageDecoderMIME(decoder).MIMEBoundary := boundary; tsValues := TStringList.Create; try repeat decoder.SourceStream := ARequestInfo.PostStream; decoder.FreeSourceStream := false; decoder.ReadHeader; inc(I); case Decoder.PartType of mcptAttachment,mcptText : begin ms := TMemoryStream.Create; ms.Position := 0; newdecoder := Decoder.ReadBody(ms,msgEnd); tmp := Decoder.Headers.Text; fname := decoder.Filename; decoder.Free; decoder := newdecoder; if decoder <> nil then TIdMessageDecoderMIME(decoder).MIMEBoundary := boundary; sleep(100); if fname <> '' then begin ms.SaveToFile(fname); //msgEnd := true; end else begin ms.SaveToFile(inttostr(i) + '.txt'); end; ms.Free; end; mcptIgnore: Begin try FreeAndNil(decoder); decoder := TIdMessageDecoderMIME.Create(nil); TIdMessageDecoderMIME(decoder).MIMEBoundary := boundary; finally ms.Free; end; End; mcptEOF: begin FreeAndNil(decoder); msgEnd := True end; end; until (decoder = nil) or(msgEnd); finally if decoder <> nil then decoder.Free; end; AResponseInfo.ContentText := AResponseInfo.ContentText + '</BODY><HTML>'; AResponseInfo.ContentText := '<HTML><BODY>unparsed:' + ARequestInfo.UnparsedParams + '<br>Encoding:' + ARequestInfo.ContentEncoding + '<br>Conte' + ARequestInfo.RawHeaders.Values['Content-Type'] + '<br>HashCode:' + IntToStr(ARequestInfo.GetHashCode) + '<br>Params:' + ARequestInfo.Params.Text + ' -->stream nullo<br></BODY><HTML>'; end Else Begin AResponseInfo.ContentText := '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> ' + #10#13 + '<html xmlns="http://www.w3.org/1999/xhtml"> ' + #10#13 + '<head> ' + #10#13 + '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ' + #10#13 + '<title>Pagina di prova</title> ' + #10#13 + '</head> ' + #10#13 + ' ' + #10#13 + '<body> ' + #10#13 + '<h1>Test multipart from <a href="www.synaptica.info">Synaptica Srl</a> </h1> <BR><BR> ' + #10#13 + '<form action="upload" method="post" enctype="multipart/form-data"> ' + #10#13 + '<p>key ' + #10#13 + ' <input type="text" name="key" id="key" /> ' + #10#13 + '</p> ' + #10#13 + '<p>group ' + #10#13 + ' <input type="text" name="group" id="key" /> ' + #10#13 + '</p> ' + #10#13 + ' ' + #10#13 + '<label for="file">Filename:</label> ' + #10#13 + '<label for="file">' + ARequestInfo.Document + '</label> ' + #10#13 + '<input type="file" name="file" id="file" /> ' + #10#13 + '<br /> ' + #10#13 + '<input type="submit" name="submit" value="Submit" /> ' + #10#13 + '</form></p> ' + #10#13 + '</body> ' + #10#13 + '</html> '; End; 
+1
source

It seems to me that this is a constant problem. I looked through all kinds of offers on the Internet, and there is nothing comparable with the proposed MsMultipartparser.pas. Unfortunately, this does not work for Unicode.

Why is someone much smarter than me rewriting MsMultipartparser.pas and relieving us of all the troubles?

Indy - does not work.

IPWorks - seems to just give you a file name, etc. Unable to decide how to get the file.

Alcinoe - no installation instructions, let alone explanations, and doesn't seem to work for XE8 or Delphi 10

I looked at a few others, but they are all impractical.

+1
source

Source: https://habr.com/ru/post/889476/


All Articles