Yadgar: Datei-Upload mit move_uploaded_file

High!

Ich versuche gerade eine Übungsaufgabe in McCARTY, PHP Grundlagen, S. 242f leicht modifiziert nachzuvollziehen... die Modifizierung besteht zum einen darin, dass register_globals bei mir (PHP 5 - das Lehrbuch ist die nachträglich überarbeitete PHP 5-Version eines ursprünglich für  PHP 4 gedachten Buches, wobei offensichtlich viele "Altlasten" unkorrigiert blieben) vernünftigerweise auf Off steht und ich daher statt $HTTP_POST_FILES["benutzerdatei"]["temp_name"]
$HTTP_POST_FILES[$_POST["benutzerdatei"]]["temp_name"]
verwenden muss.

Zum anderen will ich die Datei nicht in den lokalen Apache-Server, sondern in meinen Webspace (www.bergisch-afghanistan.de) uploaden... hier sind die beiden Skripte:

Das HTML-Formular:

[code=html]
<html>
<head>
<title>PHP: Upload einer Datei (McCarty, PHP Grundlagen, S. 242f)</title>
</head>
<body>
<h2>Datei-Upload</h2>
<form method="post" action="McCarty_242b.php" enctype="multipart/form-data">
Laden Sie diese Datei auf den Server:
<input name="Benutzerdatei" type="file"></input>
<br><br>
<input type="submit" value="Datei senden!"></input>
</form>
</body>
</html>
[/code]

Die eigentliche Upload-Routine:

[code=php]
<?php
  move_uploaded_file($_FILES["$_POST['Benutzerdatei']"]["temp"], "http://www.bergisch-afghanistan.de/ein_wochenende_in_protohafisabad_2007.txt");
  $ergebnis = $ergebnis ? "Die Datei wurde erfolglich auf den Server geladen!" : "Die Datei konnte nicht hochgeladen werden!";
  echo $ergebnis;
?>
[/code]

So weit, so gut... nur scheint da irgendwie der Wurm drin zu sein, denn ich bekomme die Fehlermeldung:

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\xampp\htdocs\bleimann\PHP\McCarty_242b.php on line 2

Wo bitte ist denn da Whitespace?

Bis bald im Khyberspace!

Yadgar

  1. Nachtrag: statt $_FILES muss es natürlich $_HTTP_POST_FILES heißen - was aber an der Fehlermeldung auch nichts ändert!

    1. Hello,

      Nachtrag: statt $_FILES muss es natürlich $_HTTP_POST_FILES heißen - was aber an der Fehlermeldung auch nichts ändert!

      Umgekehrt!

      Statt $HTTP_POST_FILES muss es jetzt $_FILES heißen.

      Schau Dir $_FILES mal an in Deinem Testscript, wenn Du Files hochlädst.

      1. nur ein Element vom Typ <input type="file" ...>  also auch nur ein File hochladen
      2. zwei Elemente vom Typ <input type="file" ...> , wahlweise
        2a.  nur eins belegen
        2b.  beide belegen

      im Script

      error_reporting(E_ALL);

      echo "<pre>\n";
      echo htmlspecialchars(print_r($_FILES,1));
      echo "<pre>\n";

      und die Dritte Variante ganz ohne File-Feld im Dokument :-)

      Harzliche Grüße vom Berg
      http://bergpost.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      1. High!

        Statt $HTTP_POST_FILES muss es jetzt $_FILES heißen.

        Schau Dir $_FILES mal an in Deinem Testscript, wenn Du Files hochlädst.

        1. nur ein Element vom Typ <input type="file" ...>  also auch nur ein File hochladen
        2. zwei Elemente vom Typ <input type="file" ...> , wahlweise
            2a.  nur eins belegen
            2b.  beide belegen

        O.k. - aber mit $_FILES und ohne ["temp"] sieht es auch nicht anders aus!

        im Script

        error_reporting(E_ALL);

        echo "<pre>\n";
        echo htmlspecialchars(print_r($_FILES,1));
        echo "<pre>\n";

        Wie meinen? Du redest in Rätseln...

        Bis bald im Khyberspace!

        Yadgar

        1. Hello,

          O.k. - aber mit $_FILES und ohne ["temp"] sieht es auch nicht anders aus!

          Dann hast Du das  kleine Testscript also noch nicht geschrieben?

          <?php   ### show_upload_info.php ###

          error_reporting(E_ALL);

          echo "<pre>\n";
            echo htmlspecialchars(print_r($_FILES,1));
            echo "<pre>\n";

          ?>

          Wie meinen? Du redest in Rätseln...

          und dieses Scriptlein dann mal im action-Attribut des Upload-Formulares als Ziel angeben.

          Danach sollte Dir, wenn Du die von mir erwähnten "Übungen" durchgeführt hast, schon einiges klarer werden zum Thema Fileupload.

          Spiel einfach mal damit herum.

          Harzliche Grüße vom Berg
          http://bergpost.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    2. n'abend,

      Nachtrag: statt $_FILES muss es natürlich $_HTTP_POST_FILES heißen - was aber an der Fehlermeldung auch nichts ändert!

      bist du dir da wirklich sicher? Steuerung von Dateiuploads spricht definitv von $_FILES. $HTTP_POST_FILES hat $_FILES gegenüber einen entscheidenden Nachteil, es ist nicht automatisch global (keine sogenannte autoglobale Variable).

      weiterhin schönen abend...

      --
      #selfhtml hat ein Forum?
      sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
  2. n'abend,

    High!

    Ich versuche gerade eine Übungsaufgabe in McCARTY, PHP Grundlagen, S. 242f leicht modifiziert nachzuvollziehen... die Modifizierung besteht zum einen darin, dass register_globals bei mir (PHP 5 - das Lehrbuch ist die nachträglich überarbeitete PHP 5-Version eines ursprünglich für  PHP 4 gedachten Buches, wobei offensichtlich viele "Altlasten" unkorrigiert blieben) vernünftigerweise auf Off steht und ich daher statt $HTTP_POST_FILES["benutzerdatei"]["temp_name"]
    $HTTP_POST_FILES[$_POST["benutzerdatei"]]["temp_name"] verwenden muss.

    siehe Kommentare von Tom und mir

    move_uploaded_file($_FILES["$_POST['Benutzerdatei']"]["temp"],

    Also, irgendwie, nein. Das $_POST['Benutzerdatei'] an dieser Stelle ist nicht nur unnötig, es ist obendrein falsch. $_FILES['Benutzerdatei']["tmp_name"] ist der Wert, den du hier suchst.

    "http://www.bergisch-afghanistan.de/ein_wochenende_in_protohafisabad_2007.txt");

    Nun, das dürfte ebenfalls zu Problemen führen. PHP kann keine Dateien einfach so an einen Webserver schicken. Du musst hier schon den Verzeichnispfad angeben, in welchen die Datei geschoben werden soll. Z.B. "/selfhtml/hilfe/bergisch-afghanistan.de/www/htdocs/ein_wochenende_.txt".

    $ergebnis = $ergebnis ? "Die Datei wurde erfolglich auf den Server geladen!" : "Die Datei konnte nicht hochgeladen werden!";
      echo $ergebnis;

    warum speicherst du den String da nochmal in der Variable, wenn du ihn ohnehin nur ausgeben willst? das reicht doch vollkommen:

    echo $ergebnis ? 'jawohlja' : 'war wohl nix';

    interessant wär hier auch, woher $ergebnis überhaupt kommt?! Ich sehe in deinem Code-Beispiel nichts von einer deklaration von $ergebnis.

    Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\xampp\htdocs\bleimann\PHP\McCarty_242b.php on line 2

    Vermutlich enthält $_POST['Benutzerdatei'] irgendwelche Zeichen (Spaces?), die hier für Probleme sorgen.

    weiterhin schönen abend...

    --
    #selfhtml hat ein Forum?
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
    1. High!

      Also, irgendwie, nein. Das $_POST['Benutzerdatei'] an dieser Stelle ist nicht nur unnötig, es ist obendrein falsch.

      Ist es nicht, weil der Name der Datei dem php-Skript mittels eines Textfeldes in einem HTML-Eingabeformular übermittelt wurde - und dieses Textfeld heißt eben "Benutzerdatei"!

      "http://www.bergisch-afghanistan.de/ein_wochenende_in_protohafisabad_2007.txt");

      Nun, das dürfte ebenfalls zu Problemen führen. PHP kann keine Dateien einfach so an einen Webserver schicken. Du musst hier schon den Verzeichnispfad angeben, in welchen die Datei geschoben werden soll.

      Fragt sich nur, wie... Zugriff auf Verzeichnisse auf dem Webserver oberhalb meines home-Verzeichnisses dürfte ich schwerlich haben, von daher kann ich gar nicht wissen, wie der absolute Pfad lautet! Und was soll denn eine Upload-Routine, wenn sie für Remote-Uploads gar nicht zu gebrauchen ist?

      warum speicherst du den String da nochmal in der Variable, wenn du ihn ohnehin nur ausgeben willst? das reicht doch vollkommen:

      o.k., hatte nicht bedacht, dass man diesen Schritt auch überspringen kann!

      interessant wär hier auch, woher $ergebnis überhaupt kommt?! Ich sehe in deinem Code-Beispiel nichts von einer deklaration von $ergebnis.

      Seit wann müssen denn Variablen in PHP zwingend deklariert werden?

      Vermutlich enthält $_POST['Benutzerdatei'] irgendwelche Zeichen (Spaces?), die hier für Probleme sorgen.

      Kann nicht sein, im Formular habe ich "liste.txt" (ohne Anführungszeichen natürlich) eingegeben - oder vielleicht ist ein Zeilenumbruch mit hineingeraten...

      Bis bald im Khyberspace!

      Yadgar

      1. Hello,

        Ist es nicht, weil der Name der Datei dem php-Skript mittels eines Textfeldes in einem HTML-Eingabeformular übermittelt wurde - und dieses Textfeld heißt eben "Benutzerdatei"!

        Was aber vollkommener Unsinn ist, denn der Name des Upload-Feldes wird sowieso übertragen.
        Wenn Du die Übung schon gemacht hättest, die ich dir empfohlen habe, dann wüsstest Du das :-)

        Fragt sich nur, wie... Zugriff auf Verzeichnisse auf dem Webserver oberhalb meines home-Verzeichnisses dürfte ich schwerlich haben, von daher kann ich gar nicht wissen, wie der absolute Pfad lautet! Und was soll denn eine Upload-Routine, wenn sie für Remote-Uploads gar nicht zu gebrauchen ist?

        Die hast Du nicht persönlich (als FTP-User), sondern die hat Dein PHP-Prozess, den Du instantiieren darfst. Das sollte in der Konfiguration in der Variablen open_basedir eingetragen sein.

        Schau Dir mal Deine Konfiguration mittels phpinfo() an.
        http://de2.php.net/manual/de/function.phpinfo.php

        Und eine ausführlicher Beschreibung zum Thema Fileupload findest Du auch im Manual
        http://de2.php.net/manual/de/features.file-upload.php

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      2. n'abend,

        Also, irgendwie, nein. Das $_POST['Benutzerdatei'] an dieser Stelle ist nicht nur unnötig, es ist obendrein falsch.
        Ist es nicht, weil der Name der Datei dem php-Skript mittels eines Textfeldes in einem HTML-Eingabeformular übermittelt wurde - und dieses Textfeld heißt eben "Benutzerdatei"!

        Wenn du das so verstanden hast, möchtest du den Abschnitt "Dateiübrtragung von Browser zu Server mittels HTTP mit anschließender Verarbeitung in PHP" deines Buches nochmal lesen...

        a) Ist das kein Textfeld, sondern ein Feld zur Erfassung einer Datei
        b) Wird nicht der Pfad zur Datei an den Server geschickt, sondern der Inhalt der Datei (mit dem Dateinamen als Meta-Information)
        c) Das Feld heißt in der Tat »Benutzerdatei«, das macht es aber noch lange nicht zum Textfeld.

        "http://www.bergisch-afghanistan.de/ein_wochenende_in_protohafisabad_2007.txt");
        Nun, das dürfte ebenfalls zu Problemen führen. PHP kann keine Dateien einfach so an einen Webserver schicken. Du musst hier schon den Verzeichnispfad angeben, in welchen die Datei geschoben werden soll.
        Fragt sich nur, wie... Zugriff auf Verzeichnisse auf dem Webserver oberhalb meines home-Verzeichnisses dürfte ich schwerlich haben, von daher kann ich gar nicht wissen, wie der absolute Pfad lautet! Und was soll denn eine Upload-Routine, wenn sie für Remote-Uploads gar nicht zu gebrauchen ist?

        Ich glaube du missverstehst nicht nur mich, sondern auch die Funktionsweise des Datentransfers.

        a) Kannst du die Datei hinschreiben wo auch immer du willst, bzw. dein Webserver schreibrechte hat. In der Regel ist das irgendein Verzeichnis in deinem DocumentRoot (also dort, wo deine Webseite liegt).
        b) »Remote-Uploads« im Sinne von Browser -> Server1 -> Server2 sind sehr wohl möglich, aber in den seltensten Fällen notwendig. In deinem Fall sehe ich nicht, warum die Datei an einen weiteren Server geschickt werden sollte, ergo sprechen wir hier auch nicht von »Remote-Upload«.
        c) Transformiert der Webserver die Adresse http://www.irgendwas.de/lustiges.html nach beispielsweise /webseiten/irgendwas.de/www/htdocs/lustiges.html - PHP macht das *nicht* für dich. Du musst das Verzeichnis - in das die Datei abgelegt werden soll - schon kennen.

        Seit wann müssen denn Variablen in PHP zwingend deklariert werden?

        Ich sprach mehr von initialisieren - mit einem Wert belegen. Deklarieren als solches (wie man es aus typisierten Sprachen kennt) gibt's in PHP nicht, da hast du recht.

        Kann nicht sein, im Formular habe ich "liste.txt" (ohne Anführungszeichen natürlich) eingegeben - oder vielleicht ist ein Zeilenumbruch mit hineingeraten...

        Du solltest mittlerweile verstanden haben, dass ein Webserver *NICHT* auf deine Lokale Festplatte zugreifen kann und ihm deshalb der Pfad zu einer Datei auf *deiner* Festplatte *GAR NICHTS* bringt. Dein Browser übermittelt den INHALT der Datei, nicht den Pfad - andernfalls könnte der Webserver nach hause gehen...

        weiterhin schönen abend...

        --
        #selfhtml hat ein Forum?
        sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
        1. Hello,

          andernfalls könnte der Webserver nach hause gehen...

          Der ist doch schon zuhause, oder wieso heißt das bei den Anbietern immer Webserver-Housing?

          *scnr*
          Harzliche Grüße vom Berg
          http://bergpost.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)