Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   PHP-Script von Desktop-Anwendung aus anstoßen (https://www.delphipraxis.net/205690-php-script-von-desktop-anwendung-aus-anstossen.html)

runningsoft 7. Okt 2020 09:12

PHP-Script von Desktop-Anwendung aus anstoßen
 
Hallo zusammen,

ich habe folgende Problemstellung:
aus einer Desktopanwendung lade ich periodisch per FTP-Upload eine CSV-Datei auf meinen Webserver. Dort müssen nun die Daten per PHP-Script in eine Datenbank eingelesen werden.

Meine Frage ist nun: wie stoße ich am elegantesten das PHP-Script aus meiner Desktopanwendung heraus an?
Mein bisheriger Ansatz ist, über einen unsichtbaren TWebBrowser timergesteuert das PHP-Script aufzurufen. Das funktioniert auch, soweit ich das bis jetzt überblicke, gut.

Gibt es noch eine andere Lösungsmöglichkeit?

Vielen Dank vorab für Eure Antworten.

Neutral General 7. Okt 2020 09:14

AW: PHP-Script von Desktop-Anwendung aus anstoßen
 
Per TIdHTTP oder THTTPClient (System.Net.HttpClient) wäre deutlich eleganter als über einen TWebbrowser.

runningsoft 7. Okt 2020 09:30

AW: PHP-Script von Desktop-Anwendung aus anstoßen
 
Danke für den Tip. ich glaub, das wars schon. Der erste Test funktioniert.

Bbommel 7. Okt 2020 09:39

AW: PHP-Script von Desktop-Anwendung aus anstoßen
 
Und wenn du es noch so umbaust, dass du deine Daten nicht gesondert per FTP ablegst, sondern auch direkt mit in den HTTP-Request einbaust (z.B. im Body eines POST) und dein PHP-Skript die sich da abholt, dann wäre es wahrscheinlich richtig cool. :-)

runningsoft 7. Okt 2020 15:16

AW: PHP-Script von Desktop-Anwendung aus anstoßen
 
Danke für den Tipp, ist natürlich eleganter, alles in einem Rutsch zu erledigen.

Mit ziemlich viel googlen hab ich es jetz hinbekommen :-D
Falls es später jemand interessiert hier mein Ansatz
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  filename: TFileName;
  Data : TIDMultiPartFormDataStream;
begin
  filename := 'liveresults.CSV';

  if FileExists(filename) then
    begin
      try
        Data := TIdMultiPartFormDataStream.Create;
        Data.AddFile('userfile', filename, 'csv');
        Data.Position := 0;
        Memo1.Lines.Text := IdHTTP1.Post('http://bla-bla/admin/test.php', Data);
      finally
        Data.Free;
      end;

    end;
end;
Und das dazugehörige PHP-Script:
Code:
<?php
//Dateiupload entgegennehmen
$uploaddir = getcwd() . "/upload/"; // getcwd = Gets the current working directory
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

//verschiebt hochgeladene Datei aus TMP-Verzeichnis ins Upload-Verzeichnis und setzt wieder den erwarteten Dateinamen
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
  {
  $HasUploaded = true;
  }
else
  {
  $HasUploaded = false;
  }

//wenn erfolgreich hochgeladen, weiterverarbeiten
if ($HasUploaded)
  {
  $i = 0;
  //Datei zum lesen öffnen
  $fp = fopen('upload/liveresults.CSV',"r");
  while (!feof($fp))
    {
    $i++;
    //Zeilenweise einlesen
    $str = fgets($fp,500);
    //Leerzeilen überspringen
    if ($str > "")
      {
      //Kontrollausgabe, ob alle Daten angekommen sind
      //hier muss später die Verarbeitung (=Einlesen in DB) eingefügt werden
      echo "Zeile " . $i . ": " . $str;
      }
    }
  }
else
  {
  echo"Datei konnte nicht hochgeladen werden";
  }
?>

Rollo62 7. Okt 2020 15:59

AW: PHP-Script von Desktop-Anwendung aus anstoßen
 
Halllo Steffen,

danke für den Code, ich habe in Zukunft ähnliches vor,
und möchte von FTP zu HTTP wechseln.

Was mir dabei allerdings unklar ist, welcher maximale File-Size ist möglich.
Angeblich gibt es da keine Grenze, aber es wird sicher praktische Grenzen für den Upload geben.
Z.B. irgendwas das Apache definiert.

Was passiert wenn ein Upload scheitert, gibt es dann IMMER eine ordentliche Fehlermeldung per HTTP ?

Das sind alles Fragen die ich mir noch beantworten müsste.
Mein Upload liegt im Moment bei ca. 3 MB, , deshalb mache ich mir noch keine großen Sorgen darum, aber es kann auch mal größer werden.

Hast Du damit schion probiert wie zuverlässig das Ganze ist ?
Bei FTP kann man zumindest nochmal "nachladen" ohne Probleme.

himitsu 7. Okt 2020 22:57

AW: PHP-Script von Desktop-Anwendung aus anstoßen
 
Es gibt mehrere Grenzen und letztendlich kommt es auf die Configuration des Servers drauf an.

Der HTTP-Server hat ein paar Limits
und dann natürlich auch nochmal das dranhängende PHP-Modul.


Du kannst deinen Provider fragen
oder selbst nachsehn.

> upload_max_filesize
http://www.selfphp.de/funktionsrefer...en/phpinfo.php
http://www.selfphp.de/funktionsrefer...en/ini_get.php
http://www.selfphp.de/funktionsrefer...ni_get_all.php

https://stackoverflow.com/questions/...load-file-size

CCRDude 8. Okt 2020 08:08

AW: PHP-Script von Desktop-Anwendung aus anstoßen
 
Einen Aspekt vermisse ich hier noch: die HTTP-Lösung ist so wie beschrieben noch ohne jede Zugriffskontrolle, der FTP (hoffentlich SFTP/SCP) Upload dagegen schon!

Bei der Lösung über HTTP muss doppelt Wert gelegt werden auf Plausibilitätsprüfungen und natürlich eine Verarbeitung, die SQL injections ausschließt, und selbst dann kann diese Form noch von außen mit gültigen, aber falschen Werten angegriffen werden. Also muss eine Authorisierung abgefragt werden, mindestens http digest authentication, dann über https statt nur http.

Selbst wenn das "nur" was privates ist - welches vom Netz aus erreichte Server wird nicht mehrfach stündlich von automatisierten Skripten auf Lücken hin abgegrast?

Rollo62 9. Okt 2020 11:14

AW: PHP-Script von Desktop-Anwendung aus anstoßen
 
Hatte gerade nochmal Zeit damit rumzuspielen,
hier ein Script das Alles schön formatiert ausgibt:
Delphi-Quellcode:
<?php
echo 'Show my phpinfo():';
phpinfo();

echo 'Show my ini_get_all():';
$arr = ini_get_all();

echo "<pre>";
var_dump($arr);
echo "</pre>";
?>
Da jetzt alle Werte durchzusehen ist müssig, aber sehr interessant.

Was den Upload betrifft:
Mit 200MB wäre ich erstmal auf der sicheren Seite, aber bei großen Files hat FTP halt seine Vorteile
(ist ja auch dafür gemacht worden :stupid:).


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz