Beppo: Datei von Server zu Server will nicht

Hallo,

ich möchte per php eine datei von Server1 zu Server 2 karren. Leider gehts nicht. Das PDF wird in Hyroglythen auf dem Bildschirm dargestellt und im Zielverzeichnis ist es nicht zu finden.

$zielpfad = "/up/to/my/path";
if (file_exists($zielpfad)) {
$ch = curl_init($zielpfad."/meinPDF.pdf");
$ch = curl_init("http://otherserver.de/testPDF.pdf");
$zieldatei = fopen($zielpfad, "w");
curl_setopt($ch, CURLOPT_FILE, $zieldatei);
curl_setopt($ch, CURLOPT_TIMEOUT, 3600);
curl_exec($ch);
fclose($zieldatei);
echo("Der Download ist erfolgt");
} else {
echo("Der Pfad wurde nicht gefunden!");
}
exit;

Was mache ich falsch?

Beppo

  1. Hello,

    mal grundsätzlich ohne andere Aspekte:

    Was soll das?

    $ch = curl_init($zielpfad."/meinPDF.pdf");
    $ch = curl_init("http://otherserver.de/testPDF.pdf");
    

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es
    Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
  2. Hallo Beppo,

    ich habe keine Ahnung von cURL, aber nach dem, was ich in der PHP Hilfe lese, einiges...

    • Es ist sinnlos, curl_init zweimal zu rufen.
    • Es ist sinnlos, curl_init für die Zieldatei zu rufen. curl_init bekommt die Source-URL - das machst Du im zweiten Aufruf korrekt. Lass also den ersten weg.
    • Es sieht aus, als stünde in $zielpfad ein Verzeichnis. Du kannst aber ein Verzeichnis nicht mit fopen() öffnen, da musst Du den Verzeichnisnamen um einen Dateinamen verlängern - also das, was Du im ersten curl_init gemacht hast. Ich nehme an, dass fopen() Dir so, wie Du es aufrufst, FALSE zurückgibt. Das ist keine Stream-Ressource, und darum passiert weiter nichts.

    Ansonsten noch ein Hinweis für Beispiel-URLs: Dafür gibt's Vorgaben. Man verwendet example.org oder example.com, die sind dafür extra freigehalten (siehe RFC 2606)

    Rolf

    --
    Dosen sind silbern
    1. Hallo Rolf,

      ich habe das Beispiel aus dem Netz von jemandem übernommen.

      Ich glaub, ich such mal nach anderen Beispielen 😉

      Beppo

      1. D:\tmp>lwp-mirror http://www.mvv-muenchen.de/fileadmin/media/Dateien/3_Tickets_Preise/dokumente/TARIFPLAN_2017-Innenraum.PDF plan.pdf

        D:\tmp>lwp-mirror https://www.mvv-muenchen.de/fileadmin/media/Dateien/3_Tickets_Preise/dokumente/TARIFPLAN_2017-Innenraum.PDF plan.pdf

        Geht Beides bei mir. Guck mal, ob du die Ressource mit dem Browser kriegst, also dass nicht etwa der Port 80 bzw 443 oder der URL selbst blockiert ist über eine Firewall Policy.

        Und in Sachen PHP ob alle Bibliotheken verfügbar sind. MfG

    2. Ich habe jetzt mal versucht, es besser zu machen, aber das Ergebnis ist dasselbe:

      $zielpfad = "/up/to/my/path";
      if (file_exists($zielpfad)) {
      $ch = curl_init("http://example.com/123.pdf");
      $zieldatei = fopen($zielpfad."/321.pdf", "w");
      
      curl_setopt($ch, CURLOPT_FILE, $zieldatei);
      curl_setopt($ch, CURLOPT_HEADER, 0);
      curl_setopt($ch, CURLOPT_TIMEOUT, 3600);
      
      curl_exec($ch);
      curl_close($ch);
      fclose($zieldatei);
      
      
      echo("Der Download ist erfolgt");
      } else {
      
      echo("Der Pfad wurde nciht gefunden!");
      }
      exit;
      

      Dieses beispiel habe ich übernommen von:

      http://php.net/manual/de/curl.examples-basic.php

      
      <?php
      
      $ch = curl_init("http://www.example.com/");
      $fp = fopen("example_homepage.txt", "w");
      
      curl_setopt($ch, CURLOPT_FILE, $fp);
      curl_setopt($ch, CURLOPT_HEADER, 0);
      
      curl_exec($ch);
      curl_close($ch);
      fclose($fp);
      ?>
      
      

      Beppo

      1. Hallo Beppo,

        dieses Script funktioniert bei mir LOKAL - also ohne Zutun eines Webservers:

        <?php
        $zielpfad = "d:/temp/php";
        if (file_exists($zielpfad)) {
          $ch = curl_init("http://www.mvv-muenchen.de/fileadmin/media/Dateien/3_Tickets_Preise/dokumente/TARIFPLAN_2017-Innenraum.PDF");
          if ($ch === false) echo "init lieferte FALSE\n";
          
          $zieldatei = fopen($zielpfad."/innenraum.pdf", "w");
          if ($zieldatei === false) echo "fopen lieferte FALSE";
          
          curl_setopt($ch, CURLOPT_FILE, $zieldatei);
          curl_setopt($ch, CURLOPT_HEADER, 0);
          curl_setopt($ch, CURLOPT_TIMEOUT, 3600);
        
          $ex = curl_exec($ch);
          if ($ex === false) {
             echo "exec lieferte FALSE\n";
             echo curl_error($ch)."\n";
          }
          
          curl_close($ch);
          fclose($zieldatei);
        
        
          echo("Der Download ist erfolgt");
        } else {
          echo("Der Pfad wurde nicht gefunden!");
        }
        exit;
        

        Ich habe erfolgreich den Innenraumplan des MVV bekommen.

        Was mir nicht gelungen ist, ist ein https-Download, da zeigt curl_error mir an, dass er Probleme mit dem Zertifikat hat. Keine Ahnung, habe ich jetzt nicht näher erforscht. Möglicherweise muss ich da noch was an meinem lokalen PHP konfigurieren.

        Interessant für Dich kann das Error-Handling sein, bau's mal ein und guck was rauskommt.

        Rolf

        --
        Dosen sind silbern
        1. Hi Rolf,

          Interessant für Dich kann das Error-Handling sein, bau's mal ein und guck was rauskommt.

          War es. Hierdurch konnte ich nämlich herausfinden, dass die Datei keine Schreibrechte auf dem Server hatte. Ich habs geändert und nun läufts auch bei mir wie gewünscht. Dankeschön.

          Beppo

          1. Hallo Beppo,

            MUUUUH - immer diese Fehler nach denen man als letztes schaut 😂

            Rolf

            --
            Dosen sind silbern
            1. Hallo Beppo,

              MUUUUH - immer diese Fehler nach denen man als letztes schaut 😂

              Wem sagst Du das? :-))

              Beppo

  3. Hallo Beppo,

    ich vermute mal (schuß ins blaue), du willst hier Curl nutzen, weil (wie du selber sagst) du das irgendwo gefunden hast und für deine Aufgabe sinnvoll erscheint.

    Da ich leider deinen genauen Anspruch nicht kenne aber vermute, dass du lediglich Dateien importieren willst, wäre Curl unnötig. (Curl ist zb. sinnvoll bei POST-Requests) In deinem Fall aber gibt ne Menge Alternativen zb. file_get_contents oder noch simpler readfile.

    Gruss
    Henry

    1. Hi Henry,

      Da ich leider deinen genauen Anspruch nicht kenne aber vermute, dass du lediglich Dateien importieren willst, wäre Curl unnötig. (Curl ist zb. sinnvoll bei POST-Requests) In deinem Fall aber gibt ne Menge Alternativen zb. file_get_contents oder noch simpler readfile.

      Geb Dir recht, aber jetzt läufts auch mit curl. Danke dennoch Beppo