luti: Datei automatisiert in Formular hochladen / WGET+Cronjob?

Hallo,

ich habe nach etlicher Zeit mal wieder ein Problem und hoffe, ihr könnt mir helfen …

Folgende Ausgangssituation: Ich generiere auf meinem managed vServer bei HostEurope mittels PHP aus einer Termin-Datenbank ein CSV-File. (Das Skript prüft dabei, ob es Änderungen in der DB gab und erzeugt nur dann eine neue Datei.) Diese Datei möchte ich in ein Fremd-System hochladen. Hierzu wird ein Html-Formular bereitgestellt, händisch funktioniert das auch einwandfrei. Nun möchte ich die CSV-Datei aber automatisiert hochladen.

Mir schwebt vor, dass dies mitttels WGET + Cronjob funktionieren könnte. Nun möchte ich aber möglichst den Cronjob auf mein PHP-Skript loslassen, nicht auf eine zusätzliche Datei mit dem WGET-Befehl. Also dachte ich mir, führe WGET im PHP-Skript per EXEC() aus. Aber irgendwie funktioniert das schon im Ansatz nicht: exec("wget -S http://www.google.com/ "); führt zu gar keinem Ergebnis.

Auch ist mir nicht klar, wie der WGET-Befehl richtigerweise aussehen müsste. Hier die Bausteine: a) URL des Formulars, b) Benutzer & Passwort, c) CSV-Datei (Formular-Feld: „file“). Wohl irgend was mit wget --auth-no-challenge --http-user=BENUTZER --http-passwd=PASS --file=??? http://exampel.test

Danke im Voraus!
luti

  1. Hi,

    Mir schwebt vor, dass dies mitttels WGET + Cronjob funktionieren könnte. Nun möchte ich aber möglichst den Cronjob auf mein PHP-Skript loslassen, nicht auf eine zusätzliche Datei mit dem WGET-Befehl.

    Dann nimm doch cURL.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hallo Chris,

      Dann nimm doch cURL.

      Mit cURL kenne ich mich leider Null aus :( Habe mal das Beispiel-Skript ausgeführt. Abgesehen davon, dass ich ein "failed to open stream: Permission denied" bekomme, über das ich jetzt mal hinwegsehe, scheint das zu "funzen".

      Aber wie bringt mich das jetzt weiter? Wie sehe für mein Bsp. der Code in etwa aus???

      Dank und Gruß,
      luti

      1. Ubs. Wollte sagen: Habe mal das Beispiel-Skript ausgeführt.

      2. Hi,

        Aber wie bringt mich das jetzt weiter? Wie sehe für mein Bsp. der Code in etwa aus???

        Schau dir die Optionen an, da sind ein paar dabei, die File-Uploads betreffen.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Hallo,

          Schau dir die Optionen an, da sind ein paar dabei, die File-Uploads betreffen.

          Ok, ich bin jetzt mal so weite gekommen:

          curl('--data "step=auto&Starten=%20Tool%20starten%20" --user name:password --form upload=@localfilename http://example.test');

          Kann ich die verschiedenen Optionen data, user und form einfach so "gemischt" verwenden? Und gebe ich als localfilename einfach Namen+Pfad zu meiner Datei an, oder muss ich da erst etwas mit open/etc. öffnen?

          Dank und Gruß,
          luti

          1. Hallo,

            » curl('--data "step=auto&Starten=%20Tool%20starten%20" --user name:password --form upload=@localfilename http://example.test');

            Ok, das war wohl etwas schnell geschossen. Jetzt habe ich schon etwas mehr Durchblick. Bislang bin ich so weit:

            $ch = curl_init();  
            $fp = fopen("/is/htdocs/.../termine.csv", "r");  
              
            curl_setopt($ch, CURLOPT_URL, "http://example.test");  
            curl_setopt($ch, CURLOPT_FILE, $fp);  
              
            # step=auto / Starten=%20Tool%20starten%20  
            # user name:password  
              
            curl_exec($ch);  
            curl_close($ch);
            

            Was muss ich jetzt noch tun, um die Authentifizierung mitzuschicken? Und wie übergebe ich step=auto und schicke das Formular ab (Starten=%20Tool%20starten%20)?

            Dank und Gruß,
            luti

            1. Moin!

              $ch = curl_init();

              $fp = fopen("/is/htdocs/.../termine.csv", "r");

              curl_setopt($ch, CURLOPT_URL, "http://example.test");
              curl_setopt($ch, CURLOPT_FILE, $fp);

              step=auto / Starten=%20Tool%20starten%20

              user name:password

              curl_exec($ch);
              curl_close($ch);

              
              >   
              > Was muss ich jetzt noch tun, um die Authentifizierung mitzuschicken? Und wie übergebe ich step=auto und schicke das Formular ab (Starten=%20Tool%20starten%20)?  
                
              Indem du alle Formularelemente der fremden Seite als Parameter (vermutlich POST-Felder, ggf. aber auch gemisch mit GET) hinzufügst. curl bietet dafür ein Interface: CURLOPT\_POSTFIELDS als Wertearray definieren.  
                
              CURLOPT\_FILE ist übrigens falsch. Dahin wird GESCHRIEBEN. Steht auch so in der Doku.  
                
               - Sven Rautenberg
              
              1. Hallo Sven & Chris,

                danke für eure Hilfe.

                Ich bin jetzt soweit gekommen wie unten angeführt. Wenn ich das Skript ausführe, passiert folgendes: Das Formular der Ziel-Seite wird angezeigt, im Feld "file" steht "<ZPublisher.HTTPRequest.FileUpload instance at 0x44aed40>". Das Formular wird jedoch nicht abgeschickt, was man auch daran sieht, dass die neuen Termine nicht eingetragen werden. Was habe ich übersehen bzw. mache ich falsch? Ist das mit dem Datei-Upload tatsächlich so einfach?

                $ch = curl_init();  
                $postopt = array('step' => 'auto', 'Starten' => '%20Tool%20starten%20', 'file' => '@/is/htdocs/.../termine.csv');  
                  
                curl_setopt($ch, CURLOPT_URL, 'http://example.test');  
                curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);  
                curl_setopt($ch, CURLOPT_USERPWD, 'ben:pass');  
                curl_setopt($ch, CURLOPT_POST, true);  
                curl_setopt($ch, CURLOPT_POSTFIELDS, $postopt);  
                  
                curl_exec($ch);  
                curl_close($ch);
                

                Dank und Gruß,
                luti

                1. Hi,

                  Wenn ich das Skript ausführe, passiert folgendes: Das Formular der Ziel-Seite wird angezeigt, im Feld "file" steht "<ZPublisher.HTTPRequest.FileUpload instance at 0x44aed40>".

                  Sind die Adresse von Formular und verarbeitender Ressource denn identisch?

                  Das Formular wird jedoch nicht abgeschickt, was man auch daran sieht, dass die neuen Termine nicht eingetragen werden. Was habe ich übersehen bzw. mache ich falsch?

                  Es soll ja auch nicht nachträglich abgeschickt werden, sondern gleich der POST-Request, den ein Browser auch beim Abschicken des Formulars machen würde, simuliert werden.
                  (Das geht natürlich nur, wenn nicht noch weitere Sicherheitsmechanismen wie bspw. irgendein Token eingebaut sind - dann müsste man tatsächlich das Formular erst "abholen", um anschließend dieses Token auch beim Request mitschicken zu können.)

                  MfG ChrisB

                  --
                  RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                  1. Hallo Chris,

                    Sind die Adresse von Formular und verarbeitender Ressource denn identisch?

                    BINGO! Das hatte ich übersehen! Besten Dank für die Frage! (Sicherheitsmechanismen sind keine eingebaut, das Formular wird ja extra zu diesem Zweck bereitgestellt.)

                    Allerdings erhalte ich eine Fehlermeldung, dass die Datei nicht geöffnet werden kann ... Noch irgend ein Tipp, woran das liegen könnte? Die Datei ist mit absolutem Pfad angegeben, die Rechte sind auf 644 gesetzt, der Owner sollte identisch sein, da die Datei ja per PHP erstellt wird. Kann ich irgend einen sinnvollen Test machen?

                    Dank und Gruß,
                    luti