$_FILES ist leer

Alles, was PHP betrifft, kann hier besprochen werden.

$_FILES ist leer

Postby ikaruz » 11. July 2006 14:31

Hallo, dies ist das erste mal das ich nen Problem habe und nicht im Stande war die Lösung in irgendeinem Forum zu finden, obwohl ich tausende Threads durchgelesen habe wo es um das selbe Problem ging.

Ich möchte einen Bild-Upload für meine Galerie schreiben. Um Bilder hochzuladen, muss man zunächst angeben um wie viele Bilder es sich handelt. Danach wird mittels PHP ein Formular mit der angegebenen Anzahl an Dateifeldern ausgegeben.

Der Code schaut so aus:
Code: Select all
if ($_REQUEST["picchoose"]) {
   
   // Variablen übernehmen
   $stamp = $_REQUEST["stamp"];
   $zahl  = $_REQUEST["zahl"];
   
   echo "<form name='form1' method='post' action='backend_operations.php' enctype='multipart/formdata'>";
   
   // Ausgabe
   for ($i=0;$i<$zahl;$i++) {
   
      $fname = "file".$i;
      
      echo $fname.": <input name='".$fname."' type='file' size='50'><br>";
      
   }
   
   echo "<input name='stamp' type='hidden' id='stamp' value='".$stamp."'><input name='zahl' type='hidden' id='zahl' value='".$zahl."'><input name='picsave' type='submit' id='picsave' value='Speichern'></form>";
   
}


Nachdem man auf "Speichern" geklickt hat passiert folgendes:
Code: Select all
if ($_REQUEST["picsave"]) {

   // Variable übernehmen
   $stamp = $_REQUEST["stamp"];
   $zahl  = $_REQUEST["zahl"];
   
   // Tabellen-Namen bestimmen
   $table = "galerie".$stamp;
   
   for ($i=0;$i<$zahl;$i++) {

      $fname = "file".$i;
      
      $file  = $_FILES[$fname]["name"];
      
      $picstamp = mktime();
      
      // In Tabelle speichern
      $save="insert ".$table." (stamp) values ('$picstamp')";
      mysql_db_query("usr_s9web51_1",$save);
      
      // Bild auf Server ablegen
      move_uploaded_file($file, "../images/galerie/".$picstamp.".jpg");
      
      // Dateirechte ändern
      chmod("../images/galerie/".$picstamp.".jpg", 0777);
   
   }


Wenn ich das Script ausführe gibt er mir diese Meldung aus:
Warning: chmod(): Unable to access ../images/galerie/1152624222.jpg in /var/www/htdocs/s9web51/html/backend/backend_operations.php on line 555

Warning: chmod(): No such file or directory in /var/www/htdocs/s9web51/html/backend/backend_operations.php on line 555


Die Bild-Datei liegt also nicht auf dem Server, allerdings werden die anderen Variablen in die Datenbank eingetragen.
$_FILES habe ich mir auch mit print_r($_FILES) ausgeben lassen, jedoch bekomme ich nur die Ausgabe: Array( )

Noch verwirrender finde ich, dass in einem anderen Backend-Upload-Bereich "$_FILES" problemlos funktioniert.

Falls ihr meine Php.ini sehen wollt: http://www.scribbleboard.de/phpinfo.php


Ich hoffe, dass ich mich nicht zu konfus ausgedrückt habe und das ihr mir helfen könnt.

ikaruz
ikaruz
 
Posts: 10
Joined: 11. July 2006 14:01
Location: Bielefeld

Postby Wiedmann » 11. July 2006 15:30

Code: Select all
$file  = $_FILES[$fname]["name"];
move_uploaded_file($file, "../images/galerie/".$picstamp.".jpg");

In "$_FILES[$fname]["name"]" steht der Name der Datei wie sie vom Client übermittelt wird, und nicht ein Pfad (+Dateiname) wo sie nach dem Upload auf dem Server liegt um ihn in move_uploaded_file() benutzen zu können.
--> Siehe:
Chapter 38. Handling file uploads
http://de.php.net/manual/en/features.file-upload.php

11.11. Wie funktioniert ein Datei-Upload über HTML-Formulare?
http://www.php-faq.de/q/q-formular-upload-php4.html

das ich nen Problem habe und nicht im Stande war die Lösung in irgendeinem Forum zu finden,
...
Ich möchte einen Bild-Upload für meine Galerie schreiben. ... Danach wird mittels PHP ein Formular mit der angegebenen Anzahl an Dateifeldern ausgegeben.

--> Siehe:
Uploading multiple files
http://de.php.net/manual/en/features.fi ... ltiple.php

11.12. Wie kann ich mehrere Dateien auf einmal uploaden?
http://www.php-faq.de/q/q-formular-mehrfach-upload.html
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby ikaruz » 11. July 2006 16:07

Stimmt. Statt "name" verwende ich jetzt "tmp_name". Außerdem habe ich mir die Tipps auf den Links durchgelesen und mein Formular in dieser Art geändert:
Code: Select all
if ($_REQUEST["picchoose"]) {
   
   // Variablen übernehmen
   $stamp = $_REQUEST["stamp"];
   $zahl  = $_REQUEST["zahl"];
   
   echo "<form name='form1' method='post' action='backend_operations.php' enctype='multipart/formdata'>";
   
   // Ausgabe
   for ($i=0;$i<$zahl;$i++) {
      
      echo "<input name='file[]' type='file' size='50'><br>";
      
   }
   
   echo "<input name='stamp' type='hidden' id='stamp' value='".$stamp."'><input name='zahl' type='hidden' id='zahl' value='".$zahl."'><input name='picsave' type='submit' id='picsave' value='Speichern'></form>";
   
}


Somit sieht meine Abfrage der Dateipfade jetzt so aus:
Code: Select all
if ($_REQUEST["picsave"]) {

   // Variable übernehmen
   $stamp = $_REQUEST["stamp"];
   $zahl  = $_REQUEST["zahl"];
   
   // Tabellen-Namen bestimmen
   $table = "galerie".$stamp;
   
   for ($i=0;$i<$zahl;$i++) {
      
      $file  = $_FILES["file"]["tmp_name"][$i];
      
      // PROBE-AUSGABE
                echo $file;
      
      $picstamp = mktime();
      
      // In Tabelle speichern
      $save="insert ".$table." (stamp) values ('$picstamp')";
      mysql_db_query("usr_s9web51_1",$save);
      
      // Bild auf Server ablegen
      move_uploaded_file($file, "../images/galerie/".$picstamp.".jpg");
      
      // Dateirechte ändern
      chmod("../images/galerie/".$picstamp.".jpg", 0777);
   
   }
   
   // Ausgabe
   echo "<span class='Stil2'>Bild(er) gespeichert.</span><p><a href='backend_gallery.php' target='_self' class='Stil2'>[zurück]</a>";
   
}


Funktionieren tut es leider immer noch nicht. Es handelt sich nach wie vor um das selbe Problem, nämlich das $_FILES leer ist. Habe auch schon versucht statt...
Code: Select all
$file = $_FILES["file"]["tmp_name"][$i]

das hier zu schreiben:
Code: Select all
$file = $_FILES["file"]["tmp_name"][0]


Die Probe-Ausgabe bleibt jedoch stets leer, und wenn ich den Array $_FILES mit print_r ausgebe, steht da auch immer nur "Array ( )".

Habe es auch schon mit $HTTP_POST_FILES ausprobiert (war die Lösung bei einem anderem Kerl der das Peoblem hatte)... das hat aber auch nichts gebracht.[/code]
ikaruz
 
Posts: 10
Joined: 11. July 2006 14:01
Location: Bielefeld

Postby KingCrunch » 11. July 2006 16:39

Joa, was solln auch das sein?
[php]$file = $_FILES["file"]["tmp_name"][$i];[/php]
Eben hießen die Dateifelder noch file1, file2 usw, da musst du das auch so bennenen
[php]$file = $_FILES["file".$i]["tmp_name"][/php]

Desweiteren is $_FILES nicht leer, sondern wie du selbst schon sagst ein array. Mit var_dump($_FILES); hättest du an der Stelle mehr Informationen erhalten.
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby ikaruz » 11. July 2006 16:47

Code: Select all
$file = $_FILES["file"]["tmp_name"][$i];


Habe ich geschrieben, da ich unter einem der Links von Wiedmann gelesen habe, das es praktischer ist. Natürlich habe ich dementsprechend dann auch die Namen meiner Input-Felder geändert:
Code: Select all
<input name='file[]' type='file' size='50'><br>


Wenn ich mir var_dump($_FILES); ausgeben lasse, zeigt er folgendes an:
array(0) { }


Ich habe die var_dump()-Funktion über die For-Schleife geschrieben, muss es vielleicht an einer anderen Stelle stehen um mir Informationen zu liefern?
ikaruz
 
Posts: 10
Joined: 11. July 2006 14:01
Location: Bielefeld

Postby KingCrunch » 11. July 2006 16:50

Habe ich geschrieben, da ich unter einem der Links von Wiedmann gelesen habe, das es praktischer ist. Natürlich habe ich dementsprechend dann auch die Namen meiner Input-Felder geändert:
Arg, du hast daraus ein Array gemacht, ich ziehe meinen Einwand zurück :roll:
Ich habe die var_dump()-Funktion über die For-Schleife geschrieben, muss es vielleicht an einer anderen Stelle stehen um mir Informationen zu liefern?
Ich sach ma: Möglichst weit oben. So direkt am Anfang (nach Session und so) wär nett :) Aber solang du $_FILES nicht manipulierst sollte es auch nicht leer sein...
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby ikaruz » 11. July 2006 17:03

var_dump() ist relativ weit oben platziert.

Bis auf die Abfrage
Code: Select all
$file = $_FILES["file"]["tmp_name"][$i];

mache ich gar nichts mit $_FILES.

Ich muss allerdings gestehen, dass mir das mit "Session" nichts sagt.
Was ist das und könnte mein Problem damit zu tun haben?

Allerdings möchte ich noch einmal erwähnen, dass ich bereits in einem anderem Bereich, einen Datei-Upload hinbekommen habe, wo auch nichts mit Session steht.
ikaruz
 
Posts: 10
Joined: 11. July 2006 14:01
Location: Bielefeld

Postby KingCrunch » 11. July 2006 17:17

Is ja auch was anderes, was (ausser du setzt es in Verbindung) unabhängig voneinander ist, also erstmal egal. Ist etwas zum Nachlesen beim gemütlichen Abend mit ner Flasche Rotwein oder so. Es hat was damit zu tun auffn Server Daten über mehrere Seiten für jeden Benutzer einzeln tragen zu können.

Zum eigentlich Problem: Grad mit meinem Latein am Ende, ich werd mir das nochma zu Gemüte ziehen.
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby ikaruz » 11. July 2006 17:26

Das ist nett von dir.

Wie ich in meinem ersten Beitrag schon gesagt habe, gibt es ziemlich viele Menschen mit diesem Problem, bei eingen war allerdings die Lösung, dass es an der Domainweiterleitung lag. Was genau bedeutet das und könnte es auch in meinem Fall daran liegen?!

Ich habe auch schon geschaut ob es daran liegt, dass ich das Formular dynamisch mit PHP erstelle, indem ich ein fertiges in HTML gebastelt habe, welches Testwerte übermittelt. Aber auch in diesem Fall werden an $_FILES keine Werte übergeben.

Ich habe außerdem noch versucht auf die Variablen mittels $_REQUEST zuzugreifen, sähe bei meinem jetzigen Code wohl so aus:
Code: Select all
$file = $_REQUEST["file"][$i];
, wobei er mir dann jeden Dateinamen ausgegeben hat (natürlich ohne Pfad)...
ikaruz
 
Posts: 10
Joined: 11. July 2006 14:01
Location: Bielefeld

Postby KingCrunch » 11. July 2006 18:16

Guter Einwand, hast du eine Domain-Weiterleitung wie eine .de.vu-Adresse oder ähnliches?
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby ikaruz » 11. July 2006 18:45

Nein, so etwas habe ich nicht.

Meine Seite liegt auf http://www.scribbleboard.de

Das Backend (wo sich das Upload-Script befindet) erreicht man über http://backend.scribbleboard.de oder http://www.scribbleboard.de/backend/

Hatte auch schon mal einen Fehler der wegen des Sub-Domains auftrat. So scheint es in diesem Fall aber nicht zu sein, da das Script auch über die zweite Methode nicht funktioniert.
ikaruz
 
Posts: 10
Joined: 11. July 2006 14:01
Location: Bielefeld

Postby Wiedmann » 11. July 2006 19:16

Ich habe auch schon geschaut ob es daran liegt, dass ich das Formular dynamisch mit PHP erstelle, indem ich ein fertiges in HTML gebastelt habe, welches Testwerte übermittelt. Aber auch in diesem Fall werden an $_FILES keine Werte übergeben.

Zwar nicht wirklich schön. Aber um dieses nachvollziehen zu können:
Leg mal diese 2 Dateien auf deinen Server:
test.html
Code: Select all
<html>
   <head>
      <title>Uploadtest</title>
   </head>
   
   <body>
      <form enctype="multipart/form-data" action="test.php" method="post">
         Send this file 1: <input name="userfile[]" type="file">
         <br>Send this file 2: <input name="userfile[]" type="file">
         <br><input type="submit" value="Send File">
      </form>
   </body>
</html>

und test.php
Code: Select all
<pre>
   <?php
      error_reporting(E_ALL);
      print_r($_FILES);
   ?>
</pre>
<?php
   phpinfo();
?>

Dann können wir mal schauen was da passiert.
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby ikaruz » 11. July 2006 19:24

Da klappt alles einwandfrei:

http://www.scribbleboard.de/test.html


Und wie gesagt, in einem meiner Backend-Bereiche hab ich es ja auch hinbekommen, wodurch mir das Problem jetzt nur noch verzwackter vorkommt...
ikaruz
 
Posts: 10
Joined: 11. July 2006 14:01
Location: Bielefeld

Postby Wiedmann » 11. July 2006 19:44

Kurze Zwischenfrage:
Da klappt alles einwandfrei:

Les' dir nochmal das Zitat durch auf was ich mich gerade bezogen habe...
--> Was für ein Demo in HTML hast du dann gebastelt um das zu testen?
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby ikaruz » 11. July 2006 20:33

Ich habe das "dynamische" Formular einfach statisch in HTML geschrieben:
Code: Select all
<form name='form1' method='post' action='backend_operations.php' enctype='multipart/formdata'>
   
   <input name='file0' type='file' size='50'><br>
   
   <input name='stamp' type='hidden' id='stamp' value='1152200019'>
   <input name='zahl' type='hidden' id='zahl' value='1'>
   <input name='picsave' type='submit' id='picsave' value='Speichern'>
   </form>


Variable Werte habe ich durch statische ersetzt. Anzahl der Datei(en) ist 1, "stamp" hat den Wert bekommen der tatsächlich dafür benutzt werden soll (aber später halt variabel sein sollte).

Das Problem bleibt jedoch das gleiche: Es werden keine Werte übergeben.

Also liegt es vermutlich an der "backend_operations.php"-Datei.
Was es sein könnte kann ich mir aber nicht erklären, zumal keine Unterschiede zu meinem funktionierenden Bereich bestehen.
ikaruz
 
Posts: 10
Joined: 11. July 2006 14:01
Location: Bielefeld

Next

Return to PHP

Who is online

Users browsing this forum: No registered users and 15 guests