Bastian: Fehler bei move_uploaded_file

Hallo zusammen

Ich stehe gerade vor einem Problem, das mir ziemlich spanisch vorkommt. Es geht um eine simple Sache, dem Upload einer Datei.

Das Formular sieht wie folgt aus:

<form action='index.php' method='post' enctype='multipart/form-data'>
  <input type='text' name='titel' title='Titel' class='input_neu' maxlength='100' />
  <input type='text' name='dateiname' title='Dateiname*' class='input_neu' maxlength='100' />
  <input type='file' name='datei' title='Datei' class='input_neu' />
  <input type='submit' name='abschicken_datei' title='abschicken' value='abschicken' class='submit_neu' />
</form>

Das PHP-Skript:

if (isset($_POST["abschicken_datei"])) {
  $titel = $_POST["titel"];
  $dateiname = strtolower($_POST["dateiname"]);
  $datei = $_FILES["datei"]["name"];
  $dateigroesse = $_FILES["datei"]["size"];
  $dateitemp = $_FILES["datei"]["tmp_name"];
  $datum = time();
  $endung = strchr($datei, ".");

if (strlen($dateiname) <= 0) {
    $dateiname = strtolower($datei);
  }

$pfad = getcwd() . "/dateien/" . strtok($dateiname, ".") . "/" . $datum . $endung;

if (file_exists("dateien/" . strtok($dateiname, "."))) {
    $feedback = "Datei existiert bereits!";
  } else {

if (move_uploaded_file($dateitemp, $pfad)) {
      $feedback = "Die Datei wurde erstellt!";
      header("Location: index.php");
    }
}

Und folgende Meldung gelangt an den Browser zurück:

Warning: move_uploaded_file(/home/username/public_html/dateien/konzept/1191177563.doc) [function.move-uploaded-file]: failed to open stream: No such file or directory in /home/username/public_html/index.php on line 169

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpMFrkc2' to '/home/username/public_html/dateien/konzept/1191177563.doc' in /home/username/public_html/index.php on line 169

Ich habe nur viel im Netz dazu gesucht, bin aber nicht fündig geworden. Ich wäre froh, wenn mir jemand helfen könnte. Auch in Hinblick auf die Aktualität des Skripts, ob die Befehle so stimmen usw.

Merci und Gruss
Bastian

  1. Ich grüsse den Cosmos,

    Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpMFrkc2' to '/home/username/public_html/dateien/konzept/1191177563.doc' in /home/username/public_html/index.php on line 169

    Da du es nicht erwähnst, geh ich davon aus, dass du die Rechte für den Ordner falsch gesetzt hast. Da darf der Webserver nicht reinschreiben.

    Möge das "Self" mit euch sein

    --
    Fragt ein Atom das andere: Hast du mein Elektron gesehen? Ich bin heute so positiv.
    ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
    1. $path = '/user/xyz/'; # Beispiel: $path = '/upload-script/img/';
      $img_path_up = '/var/www/html/web323/html/user/xyz/';
      $groessemax = 800; # Maximal Datei Größe in KB (KiloByte)

      if ($_FILES['picture']['tmp_name'] != '')
          {
              $file = $_FILES['picture']['name'];
              $temp = $_FILES['picture']['tmp_name'];
              $path_parts = pathinfo($file);
              $filename = date('Y-m-d__H:i').'__'.md5($username).".".$path_parts["extension"];

      if($_FILES['picture']['size'] <= $groessemax*1024)
              {
                  if(decoct(fileperms($img_path_up)) == 40777)
                  {
                      if(@copy($temp, $img_path_up.$filename))
                      {
                          $error_picture = 0;   # Bilddatei hochgeladen
                      }
                      else
                      {
                         $error_picture = 1;   # Die Datei konnte nicht auf den Server geladen werden.
                          $filename = '';
                      }
                  }
                  else
                  {
                      $error_picture = 2;       # Der Upload Ordner hat keine Schreibrechte!
                      $filename = '';
                  }
              }
              else
              {
                  $error_picture = 3;     # Die Datei ist zu groß!
                  $filename = '';
              }
          }

      Vielleicht hilft dir das, denn so funzt es bei mir

      1. @Heiko:
        Ich habe in anderen Foren auch Beispiele mit dem Befehl copy() gefunden. Allerdings wird andernorts davon abgeraten und empfohlen mit move_uploaded_file() zu arbeiten.

        Könnte es sein, dass move_uploaded_file() nur in ein bestehendes Verzeichnis speichern und dieses bei Nichtexistenz nicht selbst anlegen kann?

        1. Hallo!

          Könnte es sein, dass move_uploaded_file() nur in ein bestehendes Verzeichnis speichern und dieses bei Nichtexistenz nicht selbst anlegen kann?

          Ja, genau das ist das Problem.

          Abgesehen davon wäre ich vorsichtig damit Daten vom User ($_POST) ungefiltert an das Dateisystem oder eine Datenbank weiterzureichen. Siehe: http://de.php.net/manual/en/security.filesystem.php
          http://de.php.net/manual/en/security.database.sql-injection.php

          Und ja - auf keinen Fall copy() verwenden.

          Außerdem würde ich an Stelle von

            
          if (isset($_POST["abschicken_datei"])) {  
          
          

          folgendes verwenden:

            
          if ($_FILES["datei"]['error'] == UPLOAD_ERR_OK)  
          
          

          verwenden. Vielleicht mal folgende Seite angucken:
          http://de.php.net/manual/en/features.file-upload.php

          Grüße
          Andreas

    2. Die Rechte habe ich überprüft und chmod auf 0777 gesetzt. Half nichts. Merkwürdigerweise funktioniert ein anderes Upload-Skript tadellos, mit welchem bestehende Dateien durch aktualisierte ersetzt werden können. Die Pfadangaben sind dort dieselben.

  2. $_FILES["datei"]["tmp_name"] und "$datum.$endung" sind ungleich, müßten aber glaube ich gleich sein.

    Und die Zeile
    if (file_exists("dateien/" . strtok($dateiname, "."))) {

    müßte glaube ich so lauten:
    if (file_exists($pfad)) {

    Nach dieser Zeile würde ich erst einmal eine echo-Meldung ausgeben, damit Du weisst, ob der Upload geklappt hat und die Abfrage richtig ist.

    1. @David:
      Das mit dem Pfad war schon so gewollt. Ich habe da eine etwas spezielle Hierarchie gewählt. Jedes Dokument wird in der Form timestamp.dateiendung in einen Ordner "dateiname-ohne-endung" gespeichert. Wird das Dokument angepasst wird es unter neuem Timestamp in denselben Ordner gespeichert.

      Etwas kompliziert, aber dafür bei der Auslese sehr bequem. :-)

      Ich habe nun herausgefunden, was den Fehler verursachte.

      move_uploaded_file() kann keine Unterverzeichnisse erstellen. Ich habe nun mkdir() vorangestellt und nun klappt es!

      Besten Dank trotzdem.