Conbart: Datum einer Datei auf einem fremden Server anzeigen lassen

Hallo,

Ich habe folgendes Problem. Ich will mir eine Website basteln die mir dynamisch das Erstelldatum einer Datei (.pdf) anzeigt, in der Form:

Zuletzt aktuallisiert: <Datum>

Ich habe mir auch schon brav die alten Forumsbeiträge zu diesem Thema durchgelesen und festgestellt daß, das auch wunderbar mit SSI klappt:

<!--#flastmod file="<Dateiname>.pdf" -->

allerdings nur so lange sich die pdf-Datei auf dem selben Server befindet wie meine Website. Was mache ich wenn die pdf-Datei auf einem anderen Server (der mir nicht gehört) liegt?

<!--#flastmod file="http://...de/<Dateiname>.pdf" -->

funktioniert nicht

Vielen Dank im Voraus

Gruß Conbart

  1. Hallo, Conbart.

    Ich will mir eine Website basteln die mir dynamisch das Erstelldatum einer Datei (.pdf) anzeigt [...]
    Was mache ich wenn die pdf-Datei auf einem anderen Server (der mir nicht gehört) liegt?
    [SSI] funktioniert nicht

    Da blieben dir noch ein paar andere Möglichkeiten.

    Du könntest einen Socket zum Server zu öffnen, auf dem das PDF befindlich ist. Nun sendest du einen HTTP-Request (am besten HEAD, damit das PDF nicht übertragen wird) und hoffst darauf, dass der Server den Last-Modified:-Header sendet (Siehe Sektion 10.10 im RFC1945).
    Diesen kannst du dann aus der Antwort bspw. mit Regulären Ausdrücken herausfiltern. Was du dann bekommst, ist jedoch nicht das Erstellungsdatum, sondern, wie der Name schon sagt, das Datum der letzten Änderung, mit hoher Wahrscheinlichkeit in einem Unix-Zeitformat.

    Einfacher wäre es, auf dem Server ein Script zu hinterlegen, welches lokal die letzte Änderung des PDFs ausliest. Dies kannst du dann von dem anderen Server aufrufen bzw. inkludieren.
    Für PHP wäre da bspw. die Funktion filemtime interessant. Dazu musst du natürlich Zugriff auf den Server haben, auf dem das PDF-Dokument liegt.

    Grüße,
    Mathias

    1. Du könntest einen Socket zum Server zu öffnen, auf dem das PDF befindlich ist. Nun sendest du einen HTTP-Request (am besten HEAD, damit das PDF nicht übertragen wird) und hoffst darauf, dass der Server den Last-Modified:-Header sendet (Siehe Sektion 10.10 im RFC1945).
      Diesen kannst du dann aus der Antwort bspw. mit Regulären Ausdrücken herausfiltern. Was du dann bekommst, ist jedoch nicht das Erstellungsdatum, sondern, wie der Name schon sagt, das Datum der letzten Änderung, mit hoher Wahrscheinlichkeit in einem Unix-Zeitformat.

      Hallo Mathias,

      Danke für die Antwort also wenn käme dann in meinem Fall nur die erste Möglichkeit in Frage, da ich leider keinen Zugriff auf den Server mit der pdf-Datei habe.
      Zu meiner Schande muß ich gestehen, ich weiß nicht wie man einen Socket öffnet und einen HTTP-Request sendet (und was ist HEAD?).
      Und wie filtere ich das ganze raus?
      (Durch lesen des RFC1945 bin ich leider auch nicht schlauer geworden)

      Trozdem danke für Deine schnelle Antwort

      Gruß Conbart

      1. Zu meiner Schande muß ich gestehen, ich weiß nicht wie man einen Socket öffnet und einen HTTP-Request sendet (und was ist HEAD?).
        Und wie filtere ich das ganze raus?

        Hallo, Conbart.

        Ich hatte gerade mit Mühe einen ellenlangen ausschweifenden Text geschrieben, welcher plötzlich verschwunden ist, da ich scheinbar beim Heraussuchen einiger Blätter zu Perl Compatible Regular Expressions die Fluchttaste berührt habe - jetzt habe ich offen gesprochen keinen Nerv mehr, alles aus dem Kopf neu zu entwerfen.
        (Deswegen langweile ich dich jetzt nicht mehr mit langen Erklärungen zur Funktionsweise des HTTP-Protokolls und gebe dir gleich ein PHP-Skript an die Hand, welches die Aufgabe lösen dürfte. Du kannst mich ggf. anmailen oder noch einmal fragen, falls du noch speziellere Fragen hast.)

        Das Beispiel ist auszugsweise der PHP-Dokumentation entnommen (http://www.php.net/manual/de/) und modifiziert. Dort findest du auch Erklärungen zu den Funktionen fsockopen, fputs, fgets und preg_match, falls das Skript nicht nur nutzen willst, sondern auch wissen möchtest, wie es funktioniert.

        Die Variablen $dateipfad sowie $host musst du folgendermaßen anpassen.
        Wenn zum Beispiel das PDF-Dokument unter der URL http://www.beispielserver.de/beispielverzeichnis/dokument.pdf verfügbar ist, müssen die Variablendefinitionen $dateipfad="/beispielsverzeichnis/dokument.pdf"; und $host="www.beispielserver.de"; lauten.

        --8<--
        <?php
        $dateipfad="/test.pdf";
        $host="molily.dyndns.org";

        $timeout=5;
        $antwort="";
        $request="HEAD ".$dateipfad." HTTP/1.0\r\nHost: ".$host."\r\n\r\n";

        $fp=fsockopen($host, 80, &$errno, &$errstr, $timeout);
        if (!$fp) {
         die($errstr ($errno)."<br>\n"); // Verbindung fehlgeschlagen
        } else {
         fputs($fp, $request);
         while (!feof($fp)) {
          $antwort.=fgets($fp, 128);
         }
         fclose($fp);
        }

        if (preg_match("~Last-Modified:\s([^\r\n]+)~i", $antwort, $treffer)) {
         $timestamp=strtotime($treffer[1]);
         $zeitstring=date("d.m.y H:i", $timestamp);
         echo($zeitstring." Uhr");
        } else {
         echo("unbekannt");
        }

        ?>
        -->8--

        Obiges ist bspw. unter dem Namen check-lastmod.php zu speichern und kann anschließend in einer anderen .php-datei in folgender Art eingefügt werden:
        Letzte Änderung: <?php include("check-lastmod.php"); ?>

        Dann dürfte bspw. beim Aufruf dort stehen: "Letzte Änderung: 26.12.01 19:10 Uhr" oder "Letzte Änderung: unbekannt" falls der Server keinen Last-Modified-Header gesendet hat.

        Probiere das erst einmal aus. Man kann das auch so modifizieren, dass man das Skript mit Parameter aufruft und so unterschiedliche Dateien abfragen kann.

        P.S. Das Skript kann man sicherlich an jeder Ecke optimieren, es ist nur ein Quick'n'Dirty-Hack. ;)

        Grüße,
        Mathias

        1. Dann dürfte bspw. beim Aufruf dort stehen: "Letzte Änderung: 26.12.01 19:10 Uhr" oder "Letzte Änderung: unbekannt" falls der Server keinen Last-Modified-Header gesendet hat.

          Hallo Mathias,

          Nochmals Danke für die Mühe die Du Dir gemacht hast, habe alles so gemacht wie Du es geschrieben hast. Ich habe den $dateipfad und $host modifiziert, das ganze in einer php Datei gespeichert und diese mit php include in den HTML Quellcode eingebunden, aber leider funktioniert es nicht. Bei Aufruf steht da nur:

          Letzte Änderung:

          Das wars schon, mehr kommt nicht. Das hier sind die Infos der Software die auf dem Server installiert ist auf dem ich die HTML und die PHP Datei gepeichert habe:

          Installierte Server-Software: Apache/1.3.12 (Unix) PHP/4.0.1pl2

          Denke das es vielleicht daran liegen kann, aber habe nicht genug Ahnung davon.

          Gruß Conbart

          1. Hallo, Conbart.

            leider funktioniert es nicht. Bei Aufruf steht da nur:
            Letzte Änderung:
            Das wars schon, mehr kommt nicht.

            Okay, ich habe das Skript etwas modifiziert. Probiere folgendes:
            --8<--
            <?php
            // Folgende Zeilen anpassen:
            $dateipfad="/test.pdf";
            $host="molily.dyndns.org";

            $timeout=5;
            $antwort="";
            $request="HEAD ".$dateipfad." HTTP/1.0\r\nHost: ".$host."\r\n\r\n";

            $fp=fsockopen($host, 80, &$errno, &$errstr, $timeout);
            if (!$fp) {
             die($errstr." (".$errno.")<br>\n"); // Verbindung fehlgeschlagen
            } else {
             fputs($fp, $request);
             while (!feof($fp)) {
             $antwort.=fgets($fp, 128);
             }
             fclose($fp);
            }

            // In folgender Zeile das "//" entfernen, damit die Antwort angezeigt wird, um ggf. Fehler zu finden:
            // echo($antwort."\n\n");

            if (preg_match("~HTTP/1.(0|1)\s404~", $antwort)) echo("Datei nicht gefunden (404)! ");
            if (!preg_match("~HTTP/1.(0|1)\s200~", $antwort)) {
             echo("Request fehlgeschlagen!");
            } else {
             if (preg_match("~Last-Modified:\s([^\r\n]+)~i", $antwort, $treffer)) {
              $timestamp=strtotime($treffer[1]);
              $zeitstring=date("d.m.y H:i", $timestamp);
              echo($zeitstring." Uhr");
             } else {
              echo("unbekannt");
             }
            }
            ?>
            -->8--

            Dort war auch ein kleiner Fehler im Quelltext, welcher die Fehlerausgabe verhindert hat.
            Wenn das Skript jetzt nicht funktioniert, sollte es zumindest einen Fehler ausgeben.

            Installierte Server-Software: Apache/1.3.12 (Unix) PHP/4.0.1pl2
            Denke das es vielleicht daran liegen kann, aber habe nicht genug Ahnung davon.

            Nein, PHP 4 als Modul in Apache dürfte ausreichen.
            Das Problem könnte daran liegen, dass der Server, auf dem du das PHP-Skript laufen lässt, so konfiguriert ist (bzw. das PHP-Modul so kompiliert ist), dass in PHP-Skripts die Funktion "fsockopen" nicht verfügbar ist, also dass man mit PHP keine Verbindungen zu anderen Computern herstellen kann. (Aber dann müsste trotzdem eine Fehlermeldung erscheinen.)
            Daran kannst du dann leider nichts ändern.

            Mathias