romy: move file

Hi,

ich habe im manual gesucht, aber keine Funktion gefunden, die eine Datei verschieben kann. (Ausser direkt nach dem upload, mit move_uploaded_file)
Soll das so sein oder gibt es eine Funktion, die ich übersehen habe?
Wie würde man das sonst realisieren?

Hintergrund:
Habe einen Bilderupload, wo die Dateien erstmal in ein upload-Verzeichnis kommen, in welches php auch schreiben darf. Später sollten die Dateien aktiviert werden (nach vorheriger Kontrolle über deren Inhalte). Doch dazu müsste ich sie möglichst auch in eine anderes Verzeichnis schieben.
Ich wollte eigentlich nicht auf dieses Verzeichnis zugreifen. Allerdings kann ich sie vorher nicht in mein Zielverzeichnis verschieben, da ich keine Rechte habe.

ciao
romy

--
DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
->Alles ist gut wenn es aus Schokolade ist
  1. Hallo Romy,

    ich habe im manual gesucht, aber keine Funktion gefunden, die eine Datei verschieben kann. (Ausser direkt nach dem upload, mit move_uploaded_file)

    Suchst Du rename() ?
    http://www.php.net/manual/de/function.rename.php

    Hintergrund:
    Habe einen Bilderupload, wo die Dateien erstmal in ein upload-Verzeichnis kommen, in welches php auch schreiben darf. Später sollten die Dateien aktiviert werden (nach vorheriger Kontrolle über deren Inhalte). Doch dazu müsste ich sie möglichst auch in eine anderes Verzeichnis schieben.
    Ich wollte eigentlich nicht auf dieses Verzeichnis zugreifen. Allerdings kann ich sie vorher nicht in mein Zielverzeichnis verschieben, da ich keine Rechte habe.

    Wer hat welche Rechte? Kannst Du das genauer spezifizieren?
    Wenn _Du_ auf Dein Zielverzeichnis nicht zugreifen kannst, meinst Du dann Dich als Benutzer, oder der Benutzer, unter dem PHP ausgeführt wir, beim Modul also der Benutzer, unter dem der Webserver läuft?

    Gruss,

    Vinzenz

    1. Hallo Romy,

      mv setzt sich bei php zusammen aus:

      copy()    in neue Datei kopieren
      unlink()  die alte Datei löschen

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
      1. Hi Tom,

        mv setzt sich bei php zusammen aus:

        copy()    in neue Datei kopieren
        unlink()  die alte Datei löschen

        Das ist richtig, aber in einem modernen File-System tut's rename(), wie Vinzenz sagt, sehr viel schneller. Ausserdem bleiben Dateidatum etc. unangetastet, es wird also nur die Dateizuordnungstable geändert, nicht die Daten an sich....
        (Dass ich hier von Linux-Journaling-File-Systemen wie EXT3 oder ReiserFS spreche versteht sich von selbst - Win kann's halt (noch) nicht ;-))

        Fabian
        [der wieder einsatzbereite...]

        1. Hi,

          mv setzt sich bei php zusammen aus:

          copy()    in neue Datei kopieren
          unlink()  die alte Datei löschen
          Das ist richtig, aber in einem modernen File-System tut's rename(), wie Vinzenz sagt, sehr viel schneller. Ausserdem bleiben Dateidatum etc. unangetastet, es wird also nur die Dateizuordnungstable geändert, nicht die Daten an sich....

          Ich wollte noch schreiben: ...damit es auch unter WinDOS funktioniert, hab dann aber gedacht, reicht doch, wenn es überhaupt klappt. Entschuldige bitte, Romy. War vorhin irgendwie noch im Stress vom Tages-Verwaltungsgeschäft *urgs, würg*

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
    2. Hi,

      Suchst Du rename() ?
      http://www.php.net/manual/de/function.rename.php

      ja, ich glaube schon, hab es gleich ausprobiert, aber logischerweise trotzdem keine Rechte

      Wer hat welche Rechte? Kannst Du das genauer spezifizieren?
      Wenn _Du_ auf Dein Zielverzeichnis nicht zugreifen kannst, meinst Du dann Dich als Benutzer, oder der Benutzer, unter dem PHP ausgeführt wir, beim Modul also der Benutzer, unter dem der Webserver läuft?

      Also ich versuche es mal, sicher bin ich nicht.
      ein php-script kann soweit ich weiss nur in ein bestimmtes Verzeichnis schreiben. Wenn dieses Script diese Dateien dort verschieben will in ein anderes ist permission denied. Welche Rechte das Script hat weiss ich nicht.
      der upload-order hat: rwxr-xr-x
      der Zielordner hat: das Gleiche liegt aber im Homeverzeichnis, währenddessen der upload-ordner in usr/local/httpd/htdocs liegt

      Ich persönlich als user kann diese Dateien manuell verschieben.
      Wie kriege ich das Script dazu?

      (Ich meine mit dem PHP-Script also den Nutzer unter dem der Webserver läuft.)

      ciao
      romy

      --
      DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
      ->Alles ist gut wenn es aus Schokolade ist
      1. Hallo Romy,

        ja, ich glaube schon, hab es gleich ausprobiert, aber logischerweise trotzdem keine Rechte
        Also ich versuche es mal, sicher bin ich nicht.
        ein php-script kann soweit ich weiss nur in ein bestimmtes Verzeichnis schreiben. Wenn dieses Script diese Dateien dort verschieben will in ein anderes ist permission denied. Welche Rechte das Script hat weiss ich nicht.
        der upload-order hat: rwxr-xr-x
        der Zielordner hat: das Gleiche liegt aber im Homeverzeichnis, währenddessen der upload-ordner in usr/local/httpd/htdocs liegt

        Ich persönlich als user kann diese Dateien manuell verschieben.

        Oho, das wundert mich ein wenig: Um die Datei zu verschieben musst Du _schreibend_ auf das Verzeichnis zugreifen, denn der Verzeichnisinhalt ändert sich ja.

        Dass der Webserver nicht in die Homeverzeichnisse der Benutzer schreiben kann, ist nicht weiter verwunderlich, da der Webserver sonst von _jedem_ dazu gebracht werden könnte, irgendetwas in die Homeverzeichnisse anderer Benutzer zu schreiben, sowas wie
            .profile
        und ähnliche Scherze.

        Wie kriege ich das Script dazu?
        (Ich meine mit dem PHP-Script also den Nutzer unter dem der Webserver läuft.)

        Sieh mal, Romy, was Du vorhast, ist eine Administratoraufgabe. Du möchtest dazu ein webbasiertes Administratortool schreiben. Im Augenblick wüßte ich dazu keine Lösung. Ein normales Shellskript, das in _Deinem_ Namen ausgeführt wird, sollte es tun.

        PS: Ein _einfaches_ Shellskript.

        Gruss,

        Vinzenz

        1. Hi,

          Sieh mal, Romy, was Du vorhast, ist eine Administratoraufgabe. Du möchtest dazu ein webbasiertes Administratortool schreiben. Im Augenblick wüßte ich dazu keine Lösung. Ein normales Shellskript, das in _Deinem_ Namen ausgeführt wird, sollte es tun.

          Kann ich das trotzdem anstossen mit php?
          Ich vermute jetzt ausserdem mal, dass Du mit einfachem Shellscript meinst, dass ich eine Datei anlege, welche den Befehl rename blabla enthält.
          Problem: Ich kenne die Namen der zu verschiebenden Dateien vorher nicht

          Würde es so vielleicht gehen:
          Ich lese diese kleine Datei ein in php, verändere die Variablen (ich kann ja vorher wildcars setzen, damit die Suche einfacher ist) und führe dieses Script dann aus?

          Wie sage ich diesem Script, dass es ein Administratorscript ist?

          danke für Deine Hilfe

          ciao
          romy

          --
          DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
          ->Alles ist gut wenn es aus Schokolade ist
          1. Hallo Romy,

            Kann ich das trotzdem anstossen mit php?

            Ja, mit exec() <>

            Ich vermute jetzt ausserdem mal, dass Du mit einfachem Shellscript meinst, dass ich eine Datei anlege, welche den Befehl rename blabla enthält.

            Das könntest Du mit Parametern erledigen, die Du deinem Shellskript übergibst.

            Problem: Ich kenne die Namen der zu verschiebenden Dateien vorher nicht

            s.o.

            Wie sage ich diesem Script, dass es ein Administratorscript ist?

            Da hast Du ein kleines Problem. Normalerweise handelt ein Skript im Namen dessen, der es ausführt. D.h. in _Deinem_ Fall im Namen des Benutzers, unter dem apache (es ist doch ein apache?) ausgeführt wird.

            Also darf derzeit das Skript die Aufgabe noch nicht erfüllen.
            Aber man kann ein Programm auch als anderer Benutzer ausführen lassen, z.B. mit sudo.

            Ich muss Dir aber sagen, dass mein Latein hier am Ende ist. D.h. sowas hab' ich noch nicht ausprobiert. Vielleicht findet sich jedoch jemand anderes, der es Dir einen weiteren Hinweis geben kann.

            Dein Shellskript wird allerdings in dieser Form eine Sicherheitslücke darstellen, die Du ganz genau absichern musst.

            Gruss,

            Vinzenz

            --
            Die FAQ </faq/> des Forums sind lesenswert und hilfreich.
  2. Hallo!

    ich habe im manual gesucht, aber keine Funktion gefunden, die eine Datei verschieben kann. (Ausser direkt nach dem upload, mit move_uploaded_file)
    Soll das so sein oder gibt es eine Funktion, die ich übersehen habe?

    copy() ?

    Wie würde man das sonst realisieren?

    Hintergrund:
    Habe einen Bilderupload, wo die Dateien erstmal in ein upload-Verzeichnis kommen, in welches php auch schreiben darf. Später sollten die Dateien aktiviert werden (nach vorheriger Kontrolle über deren Inhalte).

    Was heißt "aktiviert" in diesem Zusammenhang? Warum prüfst Du die Datei nicht direkt beim Upload uns schiebst sie dann direkt ins richtige Verzeichnis? Entweder Du kannst in das Zielverzeichnis schreiben oder nicht. Wenn Du es später kannst kannst DU es auch direkt beim Upload, wenn Du es da nicht kannst kannst Du es auch nicht später, zumindest wüßte ich nicht wieso das so sein sollte.

    Doch dazu müsste ich sie möglichst auch in eine anderes Verzeichnis schieben.
    Ich wollte eigentlich nicht auf dieses Verzeichnis zugreifen.

    Auf welches Verzeichnis? Du lädst die Datei hoch und verschiebst sie mit move_uploaded_file nach Prüfung in das Zielverzeichnis. Warum der Umweg über das 2. Verzeichnis?

    Allerdings kann ich sie vorher nicht in mein Zielverzeichnis verschieben, da ich keine Rechte habe.

    Wo willst Du die Datei denn hinschreiben wo Du mit PHP nicht reinschreiben darfst? Du kannst es natürlich nur in eines Deiner Verzeichnisse schreiben, in denen Du Schreibrechte hast. Wie gesagt verstehe ich nicht wieso das erst im 2. Anlauf klappen soll.
    Solange Du das aus PHP machst wird das Script immer die Rechte Deines PHP-Scriptes haben, daher wird ein exec() hier auch scheitern.

    Es ist auch nicht alleien Eine Frage der Rechte, sondern auch eine Frage des Besitzers. Vermutlich ist das das Problem. Vermutlich berfindet sich PHP oder der Apache nicht in der richtigen Gruppe um ins Home-Verzeichnis schreiben zu können. Warum willst Du das? Willst Du dei DAteien außerhalb des doc-root ablegen? Dann würde ich mir ein Verzeichnis hierfür überlegen, udn nur für dieses Verzeichnis den Besitzer, bzw. die Gruppe so zu ändern, das der Apache auch in der Gruppe enthalten ist. Danbn kannst Du auch direkt mit move_uploaded_file in dieses Verzeichnis schreiben.

    Grüße
    Andreas

    1. Hi,

      Dann kannst Du auch direkt mit move_uploaded_file in dieses Verzeichnis schreiben.

      okay natürlich, mittlerweile liegt alles so wie es soll und die ordner in die es rein soll liegen eigentlich in einem Pfad wo php reinschreiben darf, trotzdem kommt permission denied. Was nun? Wie kann ich das Problem finden?

      ciao
      romy

      --
      DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
      ->Alles ist gut wenn es aus Schokolade ist
  3. Hi,

    na gut, dann mach ich es eben einfach...
    (ich hasse diese ganze Rechtevergabe, ich stell mich da irgendwie blöd an)

    danke für eure geduldige Hilfe

    ciao
    romy

    --
    DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
    ->Alles ist gut wenn es aus Schokolade ist