rolf: copy() funzt nicht?

Hallo,

ich habe ein Formular, mit dem ich Dateien hochladen möchte. Diese werden auch alle schon brav in den Temp-Ordner des Serves geladen. Ich erstelle nun mittels mkdir() ein neues Verzeichnis, setze die Zugriffsrechte auf 0777 (-> chmod()) und in dieses Verzeichnis sollen die Dateien nun per copy() verschoben werden. Aber obwohl ich schon alle Angaben auf Richtigkeit überprüft habe (Verzeichnisname, Zugriffsrechte), streikt die Funktion bzw. gibt false zurück.

Weiß jemand eine Lösung oder kann mir jemand sagen, wie ich mir eine genaue Fehlerbeschreibung von copy() ausgeben lassen kann?

Gruß,

rolf

  1. hi,

    und in dieses Verzeichnis sollen die Dateien nun per copy() verschoben werden.

    dass dazu move_uploaded_file() empfohlen wird, ist dir bewusst?

    Weiß jemand eine Lösung oder kann mir jemand sagen, wie ich mir eine genaue Fehlerbeschreibung von copy() ausgeben lassen kann?

    hast du das error_reporting entsprechend eingestellt?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. hast du das error_reporting entsprechend eingestellt?

      error_reporting(E_ALL) nützt nichts, denn eine Fehlermeldung wird niht ausgegeben. Es funktioniert lediglich die Funktion nicht.

      1. hi,

        error_reporting(E_ALL) nützt nichts, denn eine Fehlermeldung wird niht ausgegeben. Es funktioniert lediglich die Funktion nicht.

        das klingt recht unwahrscheinlich.
        hast du irgendetwas unternommen, was die anzeige der fehlermeldungen behindern könnte?

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. hast du irgendetwas unternommen, was die anzeige der fehlermeldungen behindern könnte?

          Was wäre das denn zum Beispiel? Gezielt habe ich jedenfalls nichts dagegen unternommen.

          1. Hi,

            Was wäre das denn zum Beispiel?

            das error_reporting(E_ALL); nicht in der aller ersten zeile. sondern in der letzten

            MfG

            1. das error_reporting(E_ALL); nicht in der aller ersten zeile. sondern in der letzten

              Ja, ich hab es in der ersten Zeile. Das is alles sehr mysteriös...

          2. Hi!

            hast du irgendetwas unternommen, was die anzeige der fehlermeldungen behindern könnte?

            Was wäre das denn zum Beispiel? Gezielt habe ich jedenfalls nichts dagegen unternommen.

            z.B. ein «@» vor der Funktion, siehe auch http://de.php.net/manual/en/language.operators.errorcontrol.php

            Grüße,
            Fabian St.

            1. Hier mal der Code, alles andere bringt ja nix...

              <?
                 error_reporting(E_ALL);

              $product = $_POST["product"];
                 $prod_type = $_POST["prod_type"];

              if(!move_uploaded_file($picturesrc, "../images/katalog/" . $picturesrc_name))
                 { $msg .= "Problem beim Upload des Gerätebildes!<br>"; }

              if($lang=="de")
                 { $datasheet_dir = "../sites-deutsch/datenblaetter/"; }
                 else
                 { $datasheet_dir = "../sites-englisch/datenblaetter/"; }

              if(!move_uploaded_file($datasheet, $datasheet_dir . $datasheet_name))
                 { $msg .= "Problem beim Upload des Datenblattes!<br>"; }

              if($operating_instruction!="")
                 {
                    if(!move_uploaded_file($operating_instruction, $datasheet_dir . $operating_instruction_name))
                    { $msg .= "Problem beim Upload der Betriebsanleitung!<br>"; }
                 }

              $icon = $_POST["icon"];
                 $n = $icon - 1;

              $pikto_dir = str_replace(".gif", "", $picturesrc_name);

              mkdir("../images/katalog/pikto/" . $pikto_dir);

              for($i=0;$i<=$n;$i++)
                 {
                    $dest = "../images/katalog/pikto/" . $pikto_dir . "/" . $_FILES["pikto"]["name"][$i];
                    echo "<p>" . $_FILES["pikto"]["tmp_name"][$i] . " -> " . $dest . "</p>";
                    if(!move_uploaded_file($_FILES["pikto"]["tmp_name"][$i], $dest))
                    { $msg .= "Problem beim Upload der Piktogramme!<br>"; }
                 }

              echo "<p>" . $msg . "</p>";
              ?>

              Der Fehler tritt wohlgemerkt aber NUR bei der Schleife auf, d.h. alle andern Datei(-gruppen) werden ordnungsgemäß verschoben. Meine Ausgabe $msg ist also auf "Problem beim Upload der Piktogramme!" beschränkt.

              1. Habe vergessen, das chmod() zu kopieren:

                mkdir("../images/katalog/pikto/" . $pikto_dir);

                chmod("../images/katalog/pikto/" . $pikto_dir, 0777);

                for($i=0;$i<=$n;$i++)
                   {

              2. Hi!

                Ohne jetzt einen genaueren Blick auf den Code geworfen habe (, der zudem noch einen etwas eigenwilligen Coding-Style aufweist), tippe ich jetzt mal, dass der Fehler hier liegt:

                <?
                ...
                      if(!move_uploaded_file($_FILES["pikto"]["tmp_name"][$i], $dest))

                ...
                ?>

                Bist du sicher, dass es eine Datei $_FILES["pikto"]["tmp_name"][0], $_FILES["pikto"]["tmp_name"][1], etc. gibt? Schaue dir mal die Ausagbe von print_r($_FILES['pikto']) _vor_ der Schleife an.
                Darüber hinaus solltest du «short_open_tags» auf Off stellen und immer <?php ... ?> schreiben.

                Grüße,
                Fabian St.

                1. (, der zudem noch einen etwas eigenwilligen Coding-Style aufweist),

                  Äh, jetzt interessiert mich natürlich schon noch, was daran so eigenwillig ist?!

                  1. Hi!

                    (, der zudem noch einen etwas eigenwilligen Coding-Style aufweist),

                    Äh, jetzt interessiert mich natürlich schon noch, was daran so eigenwillig ist?!

                    Dazu hatte Cheatah vor einigen Tagen was geschrieben: https://forum.selfhtml.org/?t=111103&m=698501. Damit meine ich insbesondere Schreibweisen, wie

                      
                    if($condition == TRUE)  
                    { echo 'FOOBAR'; }  
                    
                    

                    Solch ein Code ist für Außenstehende _sehr_ schlecht zu lesen und sollte daher zugunsten allgemeiner Notationsweisen aufgeben werden. Ich versuche mich zum Beispiel weitesgehend an die PEAR Coding Standards zu halten.

                    Grüße,
                    Fabian St.

                2. Hi!

                  Ohne jetzt einen genaueren Blick auf den Code geworfen habe (, der zudem noch einen etwas eigenwilligen Coding-Style aufweist), tippe ich jetzt mal, dass der Fehler hier liegt:

                  <?
                  ...
                        if(!move_uploaded_file($_FILES["pikto"]["tmp_name"][$i], $dest))

                  ...
                  ?>

                  Leider war es das nicht. Alle leeren $_FILES["pikto"]["tmp_name"][$i] werden nicht abgefragt, da $n genau die Anzahl der beschriebenen $_FILES["pikto"]["tmp_name"][$i] ist.

                  1. Hi,

                    Leider war es das nicht. Alle leeren $_FILES["pikto"]["tmp_name"][$i] werden nicht abgefragt,

                    darum geht es ja garnicht, es geht darum ob überhaupt
                    $_FILES["pikto"]["tmp_name"][0] etc. existieren (kann).

                    MfG

                    1. Hi,

                      Leider war es das nicht. Alle leeren $_FILES["pikto"]["tmp_name"][$i] werden nicht abgefragt,

                      darum geht es ja garnicht, es geht darum ob überhaupt
                      $_FILES["pikto"]["tmp_name"][0] etc. existieren (kann).

                      MfG

                      Ich hab jetzt mal einen Download gestartet, und währenddessen das Temp-Verzeichnis mit FileZilla geöffnet. Da waren alle Temp-Dateien vorhanden.

                      Sowas hatte ich echt noch nie. Da scheint alles zu stimmen, aber es geht trotzdem nicht.

                      Vielleicht noch eine Eigenart:
                      Ich kann die Zugriffsrechte des mit mkdir() erstellen Verzeichnisses mit FileZilla nicht ändern.

  2. Hi,

    ich habe ein Formular, mit dem ich Dateien hochladen möchte.

    das hört sich mal intressant an. wohin willst du die den Hochladen?

    Diese werden auch alle schon brav in den Temp-Ordner des Serves geladen.

    woher willst du das wissen?

    Ich erstelle nun mittels mkdir() ein neues Verzeichnis, setze die Zugriffsrechte auf 0777 (-> chmod()) und in dieses Verzeichnis sollen die Dateien nun per copy() verschoben werden.

    ich hoffe direkt, nicht ein script später oder so.

    Weiß jemand eine Lösung oder kann mir jemand sagen, wie ich mir eine genaue Fehlerbeschreibung von copy() ausgeben lassen kann?

    error_reporting(E_ALL)

    MfG

    1. ich hoffe direkt, nicht ein script später oder so.

      Im selben Script. Zuerst mkdir(...), dann chmod(...), dann copy(...)

      1. Hi,

        Im selben Script. Zuerst mkdir(...), dann chmod(...), dann copy(...)

        das hab ich nicht gemeint. sondern du/er klickt auf upload und dann wird
        das gleich gemacht? oder kommt da vorher noch was anderes? evt. sind
        von dir Verwendete Variablen in der von dir verwendeten function nicht
        vorhanden? available?

        MfG

        1. das hab ich nicht gemeint. sondern du/er klickt auf upload und dann wird
          das gleich gemacht? oder kommt da vorher noch was anderes? evt. sind
          von dir Verwendete Variablen in der von dir verwendeten function nicht
          vorhanden? available?

          Upload -> Submit zu einem PHP-Script (neue Datei) -> mkdir() -> chmod() -> copy()

          Ich habe das copy() mittlerweile in move_uploaded_file() unmgewandelt. Passiert aber immer noch nix...

      2. Hi!

        ich hoffe direkt, nicht ein script später oder so.

        Im selben Script. Zuerst mkdir(...), dann chmod(...), dann copy(...)

        Warum brauchst du chmod()? Dir ist klar, dass mkdir() als zweiten Parameter einen Integerwert aufnehmen kann, der angibt, mit welchen Rechten das Verzeichnis erstellt werden soll. Darüber hinaus würde ich dem Rat wahsagas folgen und move_uploaded_file() gegenüber copy() den Vorrang geben.

        Ansonsten wäre der entsprechende Code ganz hilfreich!

        Grüße,
        Fabian St.

        1. Warum brauchst du chmod()? Dir ist klar, dass mkdir() als zweiten Parameter einen Integerwert aufnehmen kann, der angibt, mit welchen Rechten das Verzeichnis erstellt werden soll. Darüber hinaus würde ich dem Rat wahsagas folgen und move_uploaded_file() gegenüber copy() den Vorrang geben.

          Ja, das ist mir bewusst, nur wird dann der chmod-Wert nicht auf 777, sondern auf 755! Das finde ich ja eben ganz komisch...

          1. echo $begrüßung;

            Dir ist klar, dass mkdir() als zweiten Parameter einen Integerwert aufnehmen kann, der angibt, mit welchen Rechten das Verzeichnis erstellt werden soll.

            Ja, das ist mir bewusst, nur wird dann der chmod-Wert nicht auf 777, sondern auf 755! Das finde ich ja eben ganz komisch...

            Beim Programmieren ist alles erklärbar.

            Wie das Handbuch verrät, liegt das an der eingestellten umask (0022). Dieser Wert gibt an, welche Bits nicht gesetzt sein sollen. Aus dem 0777 (beachte die führende Null) wird also abzüglich der 0022 die 0755.

            Ich finde es nicht besonders sinnvoll, die Rechte mit der Holzhammermethode auf 0777 zu setzen. Versuche dir lieber klar zu werden:
            Unter welcher Kennung läuft das Script?
            Wem gehört das Verzeichnis / die Verzeichnisse?
            Wie sind die Gruppenzugehörigkeiten?
            Welche Rechte werden wirklich benötigt? Das Script muss arbeiten können, aber andere sollen nicht kontraproduktiv tätig werden können.

            Die Frage, warum per Script erstellte Verzeichnisse/Dateien nicht unbedingt auch per FTP-Zugang und umgekehrt bearbeitet werden können, sollte sich beim Klären der obigen Fragen auflösen.

            echo "$verabschiedung $name";

  3. Hallo,

    ich habe mittlerweile rausgefunden, dass es an dem von mir erstellen Verzeichnis liegen muss. In ein bereits auf dem Server vorhandenes Verzeichnis lassen sich die Dateien nämlich problemlos verschieben.

    Und was vielleicht ein Hinweis für euch sein könnte, woran das nun liegt:

    Versuche ich bestehende Verzeichnisse andere Zugriffsrechte mit FileZilla zu geben, dann erhalte ich folgende Servermeldung:

    200 SITE CHMOD command ok.

    Das vom Script erstellte Verzeichnis kann ich mit FileZilla in der Hinsich nicht verändern und ich bekomme folgende Meldung:

    550 SITE CHMOD command failed.

    Habt ihr eine Ahnung, warum ich die Zugriffsrechte des mit mit mkdir() erstellten Verzeichnisses nicht ändern kann?

    1. Hi!

      ich habe mittlerweile rausgefunden, dass es an dem von mir erstellen Verzeichnis liegen muss. In ein bereits auf dem Server vorhandenes Verzeichnis lassen sich die Dateien nämlich problemlos verschieben.

      Der Grund hierfür liegt - unter der Annahme das PHP als Modul läuft - daran, dass die mittels der PHP-Funktion mkdir() angelegten Verzeichnisse dem Benutzer gehören, unter dessen Kennung, der Apache läuft. Dadurch kannst du auch die Rechte des Verzeichnisses nicht mehr mittels deines FTP-Client ändern, sondern müsstest den Umweg über chmod() oder chown() von PHP nehmen.

      Darüber hinaus solltest du wirklich den Ratschlägen, die wir dir hier geben, folgen und diese uns auch nicht vorenthalten, da wir sonst auch nicht helfen können. Damit meine ich jetzt insbesondere https://forum.selfhtml.org/?t=111254&m=699897.

      Grüße,
      Fabian St.

      1. Hi!

        Darüber hinaus solltest du wirklich den Ratschlägen, die wir dir hier geben, folgen und diese uns auch nicht vorenthalten, da wir sonst auch nicht helfen können. Damit meine ich jetzt insbesondere https://forum.selfhtml.org/?t=111254&m=699897.

        Ja, sorry. Aber diese Files gibt es.
        Jetzt ist aber nur noch blöd, dass ich, selbst wenn das erstellte Verzeichnis 777 hat, ich keine Dateien dorthin verschieben kann. Ich rufe morgen mal meinen Anbieter an. Vielen Dank für die bisherige Hilfe. Natürlich freue ich mich auch über weitere. ;-)

        Gruß, Rolf

    2. Also,

      ich hab rausgefunden, dass es daran liegt, dass mkdir() dem Ordner einen "falschen" Besitzer zuschreibt. Ich muss also den Besitzer ändern. Allerdings gibt

      chown("verzeichnis", "richtiger_besitzer");

      FALSE zurück. Hab ich beim Einsatz der Funktion was falsch gemacht?

      1. Hallo rolf,

        chown("verzeichnis", "richtiger_besitzer");
        FALSE zurück. Hab ich beim Einsatz der Funktion was falsch gemacht?

        nein, aber du hast das Handbuch nicht gelesen:
        <zitat>
        Nur der Superuser kann den Eigentümer einer Datei ändern.
        </zitat>

        • und da der Apache zum Glück nicht als root läuft, schlägt chown eben fehl.

        Grüße aus Nürnberg
        Tobias

        1. Hallo rolf,

          Nur der Superuser kann den Eigentümer einer Datei ändern.
          </zitat>

          • und da der Apache zum Glück nicht als root läuft, schlägt chown eben fehl.

          Und was mach ich jetzt? Kann doch nicht sein, dass ich ein Verzeichnis selbst erstelle und dann keine Dateien da rein verschieben kann?!

          1. Hi,

            Und was mach ich jetzt? Kann doch nicht sein, dass ich ein Verzeichnis selbst erstelle und dann keine Dateien da rein verschieben kann?!

            schonmal probiert die dateien nicht zu verschieben sondern zu kopieren?
            also im ordner eine komplett neue datei zu erstellen?

            MfG

            1. Hi,

              Und was mach ich jetzt? Kann doch nicht sein, dass ich ein Verzeichnis selbst erstelle und dann keine Dateien da rein verschieben kann?!

              Nein. Behalte ich mir mal im Hinterkopf. Ich habe aber mittlerweile die Fehlermeldung von move_uploaded_file() (display_errors in der INI war auf Off, hab ich per ini_set() geändert):

              SAFE MODE Restriction in effect. The script whose uid is 666 is not allowed to access /home/www/web6/html/images/katalog/pikto/test owned by uid 30 in /home/www/web6/html/admin/newinstr_prev.php on line 49

              1. Hi,

                SAFE MODE Restriction in effect. The script whose uid is 666 is not allowed to access /home/www/web6/html/images/katalog/pikto/test owned by uid 30 in /home/www/web6/html/admin/newinstr_prev.php on line 49

                klingt ganz so als ob der ordner nicht mit php erstellt wurde.

                MfG

                1. klingt ganz so als ob der ordner nicht mit php erstellt wurde.

                  MfG

                  Der Ordner wird präzise eine Zeile vorher erstellt.

  4. So, an alle, die es noch interessiert: Ich habe das Problem gelöst.

    Problem war, dass mkdir() für den neuen Ordner einen anderen Besitzer einträgt. Durch die aktivierte Option SAFE MODE wurde verhindert, dass der Scriptbesitzer in diesen Ordner schreiben kann.

    Über den FTP-Zugang kann ich mich per PHP als "richtiger" Besitzer anmelden und den Ordner mit ftp_mkdir() erstellen. Damit wird für den neuen Ordner nun auch dieser Besitzer eingetragen und das Script darf Dateien schreiben.

    Ich weiß nicht, ob ich jetzt 100% richtig beschrieben hab, im Prinzip ist es aber richtig.

    Gruß,

    rolf

    P.S.: Vielen Dank nochmal an alle, die mir helfen wollten.