![]() |
Per WebInterface Programm steuern
Versuche im moment sowas zu coden...
Aber irgendwie hänge ich schon am Anfang! ;) Was brauch ich dafür... wie mach ich das... da gibt es einiges wo riesiege Fragezeichen dranstehen! Indy ist sicherlich klar! Aber brauche ich da sonst was? Wie zB bekomme ich Daten an den Webserver... - obwohl, das ist klar... Per Timer immer neue HTML Dateien erzeugen... aber wie weiter? Wie kann ich ein Formular abfragen? Also wie kommen sachen, die ich im WebInterface eingegeben habe in das Delphi Programm? oder: Wie kann ich eine Datei über das WebInterface an den Server schicken? Fragen über Fragen, hoffentlich hilft mir hier jemand ;) MfG DarthDestroyer |
Re: Per WebInterface Programm steuern
Hi,
ich glaube du solltest dir als erstes überlegen, was du wirklich machen möchtest. Dann wäre die zweite Überlegung womit du dies am besten realisieren möchtest. Korrigier mich bitte, wenn ich dich komplett falsch verstanden habe, aber du möchtest ein Webinterface benutzen? Für mich heißt das, dass du eine Webseite in einem Browser darstellen möchtest. Soweit richtig? Dateien über ein Webinterface an den Server schicken geht dann ganz einfach, du schreibst dir ein HTML Formular. Das abschicken der Daten übernimmt dann dein Browser für dich. Da du von einem Server sprichst, sehe ich noch nicht ganz wo dein Programm reinpasst. Ein normaler Webserver wird deine Anfrage entgegen nehmen und kann die dann bearbeiten. Bei den freien Lösungen würde sich hier jetzt der Apache-Server anbieten. Für den findest du dann gute Module für Perl und PHP, die du eventuell einfacher für dein Programm verwenden kannst. Mit dem Tomcat Server könntest du auch leicht serverseitige Java-Programme schreiben. Natürlich kannst du per CGI auch Delphi verwenden und nicht zuletzt kann auch ein Delphi Programm als dein Server fungieren, die Frage ist ob du das brauchst. Warum du aber per Timer HTML Seiten erzeugen möchtest, ist mir noch null klar. Ich mein klar, kannst du machen, aber dein Webinterface sollte ja nunmal in einem Browser angezeigt werden, wie du dort dann einen Timer reinbaust... Wie gesagt, mir ist noch nicht klar was du machen möchtest und eventuell wäre ein anderer Weg einfacher! Gruß Der Unwissende |
Re: Per WebInterface Programm steuern
zB. Timer:
Stell dir mal vor, du hast einen Server zu Hause. Auf diesem läuft bereits ein normaler WebServer... etc. Nun möchtest du von einem anderen Rechner aus wissen, wie es ihm "geht". Also tippst du die IP von dem Server in einen Browser. 192.168.0.1 zB Dann noch den Port... zB 2025 (sollte ein freier sein). Also steht nun im Browser: ![]() Nun habe ich meine ersten Schritte mit dem IDHTTPSERVER gemacht und siehe da, alles was ich bisher haben wollte funzt dort wunderbar! Port 2025 an die Komponente gebunden, allerdings keine Bindings... (noch nicht ;) ) Jetzt aber wieder zu dem Timer. Wie gehts dem Rechner nun? Man erzeugt einfach per Timer eine Seite, die zB die Systemlast anzeigt... etc. Man brauch diesen Timer, weil man ja auch wissen möchte, was der Rechner gemacht hat, als man diese Seite nicht gerade besucht hat! Wenn man den Timer weglassen würde, würde da nur die Systemlast, die der Rechner im moment hat angezeigt... Hoffe du kannst es jetzt verstehen... Mein normaler Server soll so bleiben. MfG |
Re: Per WebInterface Programm steuern
Was für ein Server ist das denn... nennst du ein 2000 oder 2003 Server dein Eigen, so kannst du auch alternativ den Terminaldienst installieren, und dich über Remote Desktop einloggen und hast dann alle Möglichkeiten als würdest Du vorm Server sitzen.
|
Re: Per WebInterface Programm steuern
Ok, jetzt denke ich verstehe ich grob was du machen möchtest.
Allerdings denke ich kannst du einen schöneren Weg gehen. Speicher einfach in deinem Timer Event nur die Werte ab, die du ausliefern möchtest. In eine HTML-Seite kannst du die immer noch bei Bedarf wandeln (wenn jmd. diese haben möchte). Ich weiß jetzt ehrlich gesagt nicht genau, was du wissen möchtest. Alles was du brauchst solltest du leicht finden. Zu den Indys gibt es gute Beispiele und eine OH, die recht vollständig und imho verständlich ist. Wie du eine Verbindung herstellst denke ich weißt du? Im TIdHTTPRequestInfo stehen die Infos zur Anfrage (welche URI, welche Parameter, ...) über das TIdHTTPResponseInfo kannst du dann mittels ServeFile eine Datei ausliefern. Wie man diese Datei erstellt, ist dir sicher klar? Jedenfalls fragst du da nicht nach. Ok, noch mal die Frage durchgelesen. Ja, schau dir einfach das OnCommandGet-Event an. Das tritt immer bei einer Anfrage auf. Es gibt verschiedene Anfragen. Was du immer bekommst ist ein Request und ein Response Objekt (Protokoll bedingt). Das Request-Objekt kapselt dann immer alle Eigenschaften der Anfrage. Hier ist es eigentlich nur wichtig zu schauen, welche URI angefordert wurde und entsprechend etwas auszuliefern. Unter Params findest du automatisch die geparsten Parameter. Alles was du dieser Anfrage antworten möchtest, kannst du über das Response Objekt machen. Diese gehört direkt zur Anfrage. Hier findest du alles was du zum ausliefern brauchst. Nimm für den Anfang einfach die ServeFile Methode deines Servers. Hier kannst du dann den Thread und das Response-Objekt der Anfrage nehmen, fertig. Gruß Der Unwissende |
Re: Per WebInterface Programm steuern
So, ist zwar noch nicht eingebunden, die Timer Sache, aber soweit funzt es eigentlich alles!
Nur habe ich ein kleines Problem beim Upload, und zwar bekomme ich den Originale Filename nicht angehangen! Aber irgendwoher muss ich doch wissen, was für ein Typ die Datei ist, und vor allem wäre der Dateinamen auch nicht schlecht...
Delphi-Quellcode:
Ist zwar ein bisschen viel, aber das sollte gehen ;)
unit Unit1;
interface uses Windows, Messages, SysUtils, ShellApi, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdScheduler, IdSchedulerOfThread, IdSchedulerOfThreadDefault, IdIntercept, IdServerInterceptLogBase, IdServerInterceptLogEvent, IdServerIOHandler, IdServerIOHandlerSocket, IdServerIOHandlerStack, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, IdContext, IdCustomHTTPServer, IdHTTPServer, IdHTTPHeaderInfo, Menus; type TForm1 = class(TForm) IdHTTPServer1: TIdHTTPServer; IdServerIOHandlerStack2: TIdServerIOHandlerStack; IdServerInterceptLogEvent2: TIdServerInterceptLogEvent; IdSchedulerOfThreadDefault2: TIdSchedulerOfThreadDefault; Memo1: TMemo; MainMenu1: TMainMenu; Server1: TMenuItem; Aktivieren1: TMenuItem; N1: TMenuItem; Beenden1: TMenuItem; procedure IdServerInterceptLogEvent2LogString( ASender: TIdServerInterceptLogEvent; AText: String); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure IdServerIOHandlerStack2Status(ASender: TObject; const AStatus: TIdStatus; const AStatusText: String); procedure FormCreate(Sender: TObject); procedure IdHTTPServer1CreatePostStream(AContext: TIdContext; var VPostStream: TStream); procedure IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); procedure Aktivieren1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} //function fib(n:Integer):Integer; begin if (n <= 2) then result:=1 else result:=fib(n-1) + fib(n-2); end; function HTMLFormTitel:string; begin Result := '<center><font color="#C0C0C0" size="6">Server Remote Panel</font></center>'; end; function HTMLFormMain(Inhalt:string):string; begin Result := '<td align="left" width="85%" valign="top" style="word-spacing: 1; margin: 1" bgcolor="#C0C0C0"></font><font face="Arial" color="#000000">'+Inhalt+'</font><font face="Arial"></td>'; end; function HTMLFormLinks:string; begin Result := '<td width="15%" align="center" valign="top" bgcolor="#800000" style="color: #C0C0C0">'+ '[url="/"]Home[/url] '+ '[url="/upload/"]Upload[/url] '+ '[url="/info/"]Info[/url] '+ '[url="/ausfuehren/"]Anwendung starten[/url]</td>'; end; function HTMLFormUnten:string; begin Result := '</tr>'+ '</table>'+ '</font>'+ '</body>'+ '</html>'; end; function HtmlFormOben(Title:string):string; begin Result:= '<html>'+ '<head>'+ '<meta http-equiv="Content-Language" content="de">'+ '<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">'+ '<title>'+ Title +'</title>'+ '</head>'+ '<body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0" marginwidth="0" marginheight="0" bgcolor="#000000" link="#C0C0C0" vlink="#C0C0C0" alink="#C0C0C0" text="#000000">'+ '<font face="Arial">'+ '<table border="0" width="1000" id="table1" style="border-collapse: collapse" height="332">'+ '<tr>'+ '<td height="70" colspan="2" bgcolor="#800000">'+ HTMLFormTitel +'</td>'+ '</tr>'+ '<tr>'; end; function HTMLFormKomplett(FormObenTitel:string;FormInhalt:string):string; begin Result := HTMLFormOben(FormObenTitel)+HTMLFormLinks+HTMLFormMain(FormInhalt)+HTMLFormUnten; end; function HtmlForm:string; begin Result:= HTMLFormKomplett('Home', '<p align="center"> Home ' ); end; function HtmlInfoForm:string; begin Result:= HTMLFormKomplett('Info', '<p align="center"> Info ' ); end; function HtmlAusfuehrenForm:string; begin Result:= HTMLFormKomplett('Anwendung starten', '<form method="POST" action="/execute/"><p align="center"> Anwendung starten '+ '<p align="center"><input type="text" name="filename" size="20"><input type="submit" value="Ausführen" name="execute"><input type="reset" value="Reset" name="reset"></p>'+ '</form>' ); end; function HtmlUploadForm:string; begin Result:= HTMLFormKomplett('Upload', '<form action="/uploading/" method=post enctype="multipart/form-data">'+ '<p align="center"> Upload '+ ' <input type=file name=file><input type=submit value=Upload></p>'+ '</form>' ); end; function HTMLUploadMessage(msg:String):string; begin Result:= HTMLFormKomplett(msg, '<center><h1>File Upload</h1> '+msg+' '+ '[url="/><font"]Click here to continue</font>[/url]</center>' ); end; function HTMLExecuteMessage(msg:String;Error:boolean):string; begin If Error = False then begin Result:= HTMLFormKomplett('Programm Ausführen', '<center><h1>Programm Ausführen</h1> '+msg+' gestartet! '+ '[url="/><font"]Click here to continue</font>[/url]</center>' ); end else begin Result:= HTMLFormKomplett('Programm Ausführen', '<center><h1>Programm Ausführen</h1> '+msg+' konnte nicht gestartet werden! '+ '[url="/><font"]Click here to continue</font>[/url]</center>' ); end; end; procedure TForm1.IdServerInterceptLogEvent2LogString( ASender: TIdServerInterceptLogEvent; AText: String); begin Memo1.Lines.Add(AText); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin IdHTTPServer1.Active := False; end; procedure TForm1.IdServerIOHandlerStack2Status(ASender: TObject; const AStatus: TIdStatus; const AStatusText: String); begin Memo1.Lines.Add(AStatusText); end; procedure TForm1.FormCreate(Sender: TObject); begin LongTimeFormat:='hh.mm.ss'; ShortDateFormat:='dd.MM.yy'; end; procedure TForm1.IdHTTPServer1CreatePostStream(AContext: TIdContext; var VPostStream: TStream); begin VPostStream:=TMemoryStream.Create; end; procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); Var TheFile:TMemoryStream; FN:String; Error:boolean; begin If ARequestInfo.Document='/' Then begin With AResponseInfo do begin ContentText:=HtmlForm; WriteContent; end; end; If ARequestInfo.Document='/ausfuehren/' Then begin With AResponseInfo do begin ContentText:=HtmlAusfuehrenForm; WriteContent; end; end; If ARequestInfo.Document='/info/' Then begin With AResponseInfo do begin ContentText:=HtmlInfoForm; WriteContent; end; end; If ARequestInfo.Document='/upload/' Then begin With AResponseInfo do begin ContentText:=HtmlUploadForm; WriteContent; end; end; If ARequestInfo.Document='/execute/' Then begin With AResponseInfo do begin Error := False; if ShellExecute(Application.Handle, 'open', PChar(ARequestInfo.Params.Values['filename']), Nil, Nil, SW_NORMAL) <= 32 then Error := True; ContentText:= HTMLExecuteMessage(ARequestInfo.Params.Values['filename'],Error); WriteContent; end; end; if ARequestInfo.Document='/uploading/' then begin FN := ARequestInfo.Params.Values['filename']; TheFile:=TMemoryStream.Create; try try TheFile.LoadFromStream(ARequestInfo.PostStream); TheFile.SaveToFile('.\'+DateToStr(now)+' '+TimeToStr(now)+' '+ARequestInfo.RemoteIP+' '+'.unbekannt'+FN); With AResponseInfo do begin ContentText:=HtmlUploadMessage('Upload Successful!'); WriteContent; end; except With AResponseInfo do begin ContentText:=HTMLUploadMessage('Upload Error!'); WriteContent; end; end; finally TheFile.Free; end; end; end; procedure TForm1.Aktivieren1Click(Sender: TObject); begin If IdHTTPServer1.Active = False then begin IdHTTPServer1.Active := True; Aktivieren1.Caption := 'Deaktivieren'; end else begin IdHTTPServer1.Active := False; Aktivieren1.Caption := 'Aktivieren'; end; end; end. |
Re: Per WebInterface Programm steuern
Mein Problem liegt jetzt hauptsächlich darin, dass FN keine Zuweisung erhält (bzw. einen Leer-String)
Übergibt das Input-Feld überhaupt den Dateinamen? Momentan speichert das Programm sie nämlich ohne FileExtension! HILFE... MFG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz