Drathy: Probleme mit is_file bzw. file_exists

Hallo zusammen!

Ich habe hier ein kleiner Problem, was ich mir abslout nicht erklären kann!

Und zwar habe ich folgende Bedingung in meinem Script:
if(!file_exists($zieldatei))
{...}

...mit der Variablendeklaration:
$verzeichnis_vorschaubilder = "/tmp/jeschke_vorschaubilder";
$vorschau_dateiname = $dateiid.'_'.$max_breite.'.jpg';
$zieldatei = $verzeichnis_vorschaubilder.'/'.$vorschau_dateiname;

$dateiid und $max_breite bestehen jeweils aus Zahlen.

Folglich sollte die Bedingung nur ausgeführt werden, wenn die Datei nicht existiert.

Komischerweise wird die Bedingung aber immer ausgeführt, obwohl die Datei da ist! Zu erkennen daran, dass innerhalb der Bedinung auch ein DB-Eintrag gemacht wird, bei dem die Variable $zieldatei in die DB eingetragen wird...und die taucht dort nun wiederholt mit exakt dem gleichen Pfad auf...

Ich habe das Ganze auch schon mit if(!is_file($zieldatei)) probiert, mit dem selben Ergebnis...

Hat jemand ne Idee, wo das Problem liegen könnte??

Gruß,
Drathy

  1. Moin!

    Hat jemand ne Idee, wo das Problem liegen könnte??

    Wenn du nur _glaubst_, der Pfad sei korrekt: Geh sicher. Lass dir die Variable testweise ausgeben und sei dadurch SICHER, dass sie korrekt ist.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hi!

      Ich würde gern die Variablen anzeigen lassen, nur wird die Datei innerhalb eines <img>-Tags aufgerufen und mit ist nich bekannt, wie bzw. ob ich dort eine sichtbare Ausgabe machen kann...

      Gruß,
      Drathy

      1. Moin!

        Ich würde gern die Variablen anzeigen lassen, nur wird die Datei innerhalb eines <img>-Tags aufgerufen und mit ist nich bekannt, wie bzw. ob ich dort eine sichtbare Ausgabe machen kann...

        Das heißt, das relevante Skript generiert ein Bild statt einer HTML-Seite?

        Dann extrahier dir die URL aus dem IMG-Tag und rufe sie separat im Browser auf. Textausgaben sind dann recht problemlos so machbar, dass du den Header erst ganz zum Ende, vor der Bildausgabe setzt - sofern bis dahin alles gut gegangen ist (also beispielsweise testest du, ob durch Textausgaben zuvor das Bild überhaupt ausgebbar ist, indem du headers_sent() aufrufst).

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Das heißt, das relevante Skript generiert ein Bild statt einer HTML-Seite?

          Genau! Klappt generell auch wunderbar, doch sollen nun eben noch vorher kleinere Vorschaubilder generiert werden, um Traffic zu sparen...

          Dann extrahier dir die URL aus dem IMG-Tag und rufe sie separat im Browser auf. Textausgaben sind dann recht problemlos so machbar, dass du den Header erst ganz zum Ende, vor der Bildausgabe setzt - sofern bis dahin alles gut gegangen ist (also beispielsweise testest du, ob durch Textausgaben zuvor das Bild überhaupt ausgebbar ist, indem du headers_sent() aufrufst).

          Das ist clever, hab ich mal gemacht, und wie vermutet (siehe Antwort von mir weiter oben) gibt er an, dass die Bild-Datei nicht vorhanden ist, die ausgegeben werden soll...es muss also ein Problem an meinem "Vekleinerungs-Teil" sein. Komisch allerdings, da das Verkleinern zwischendurch mal definitiv funktioniert hat...

      2. Hmmm, anscheinend liegt das Problem bei mir ganz woanders, wie eine Modifizierung meines Scriptes gezeigt hat.

        Und zwar bin ich bislang davon ausgegangen, dass die betreffende Datei auch korrekt erzeugt wurde, es ist aber anscheinend nicht an dem...

        Anscheinend klappt folgender ImageMagic-Aufruf nicht:
          $verkleinern = "/usr/bin/convert convert -resize $groesse $quelldatei $zieldatei ";
          exec($verkleinern);

        Die Variablen sind wie folgt definiert:
          $groesse = $max_breite.'x'.$max_hoehe; //breit+hohe jeweils 200
          $quelldatei = $quell_verzeichnispfad.$quell_dateiname;
          $zieldatei = $verzeichnis_vorschaubilder.'/'.$vorschau_dateiname;

        Bei $quell- bzw. $zieldatei bin ich sicher, dass diese korrekt sind. Einmal begründet durch einen korrekten DB-Eintrag und einmal durch einen Testaufruf...

        Ist an $verkleinern vielleicht irgendwas faslch??

        1. Hallo,

          $verkleinern = "/usr/bin/convert convert -resize $groesse $quelldatei $zieldatei ";

          Vorneweg: Ich weiß nicht, ob Du das bereits mit $groesse, $quelldatei und $zieldatei machst, aber Du solltest unbedingt die Funktion escapeshellarg() verwenden - d.h. $verkleinern = "... " . escapeshellarg($groesse) . " " . escapeshellarg($quelldatei) . " " . escapeshellarg($zieldatei); Andernfalls könnte das dazu führen, dass jemand im ungünstigsten Fall (muss nicht sein, aber gehe da lieber auf Nummer sicher) beliebige Befehle auf Deinem Server ausführen kann.

          Und dann zum Problem: Warum das 2. convert? Also warum "/usr/bin/convert convert -resize ..."? Eigentlich erwartet convert aus dem ImageMagick keinen Parameter namens convert - d.h. "/usr/bin/convert -resize ..." sollte richtig sein - sofern convert in /usr/bin liegt.

          Viele Grüße,
          Christian

          --
          "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
          1. Vorneweg: Ich weiß nicht, ob Du das bereits mit $groesse, $quelldatei und $zieldatei machst, aber Du solltest unbedingt die Funktion escapeshellarg() verwenden - d.h. $verkleinern = "... " . escapeshellarg($groesse) . " " . escapeshellarg($quelldatei) . " " . escapeshellarg($zieldatei); Andernfalls könnte das dazu führen, dass jemand im ungünstigsten Fall (muss nicht sein, aber gehe da lieber auf Nummer sicher) beliebige Befehle auf Deinem Server ausführen kann.

            Ui, danke für den Tipp - war mir nicht bewusst...werde das abändern...

            Und dann zum Problem: Warum das 2. convert? Also warum "/usr/bin/convert convert -resize ..."? Eigentlich erwartet convert aus dem ImageMagick keinen Parameter namens convert - d.h. "/usr/bin/convert -resize ..." sollte richtig sein - sofern convert in /usr/bin liegt.

            Gute Frage, warum das 2. Convert...vielleicht war das dann ja der Fehler... Was den Pfad zu convert angeht, ist der so schon korrekt - habe ich so vom Serverbetreiber erhalten...

            Ich sage schon mal danke und werde das gleich Montag morgen testen!!!

            Gruß,
            Drathy

            1. Problem scheint gelöst, es lag wohl an den fehlenden Anführungszeichen...

              So geht's:
                  $verkleinern = "/usr/bin/convert -resize $groesse '$quelldatei' '$zieldatei' ";

              Danke an alle, die sich damit beschäftiogt haben!

              Gruß,
              Drathy

          2. Hi!

            Und dann zum Problem: Warum das 2. convert? Also warum "/usr/bin/convert convert -resize ..."? Eigentlich erwartet convert aus dem ImageMagick keinen Parameter namens convert - d.h. "/usr/bin/convert -resize ..." sollte richtig sein - sofern convert in /usr/bin liegt.

            Leider war das nicht das Problem gewesen... :((

            Gruß,
            Drathy

  2. Hi,

    ...mit der Variablendeklaration:
    $verzeichnis_vorschaubilder = "/tmp/jeschke_vorschaubilder";

    Ist das wirklich der Pfad im Dateisystem?
    Oder ist das ein Pfad unterhalb Deines Web-Document-Root?

    Falls wirklich ersteres: hat der PHP-Interpreter dort die nötigen Zugriffsrechte?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hi!

      ...mit der Variablendeklaration:
      $verzeichnis_vorschaubilder = "/tmp/jeschke_vorschaubilder";
      Ist das wirklich der Pfad im Dateisystem?
      Oder ist das ein Pfad unterhalb Deines Web-Document-Root?

      Jup, der Pfad ist schon richtig und die Rechte sind auch vorhanden...