# XAMPP lokal für php Bildupload konfigurieren



## PhoenixDH (10. Juli 2006)

Kann mir bitte jemand sagen wie ich meinen lokalen Apache (XAMPP) konfigurieren muss, damit der php-Bildupload funktioniert? Im Moment macht das Script gar nichts. Auf meinem Webserver klappt aber alles, muss jedoch lokal etwas testen!


----------



## PhoenixDH (12. Juli 2006)

Kann mir keiner helfen?
Muss da überhaupt was konfiguriert werden? Aber am Script kanns ja nicht liegen normal!


----------



## Neurodeamon (12. Juli 2006)

Du »erwartest« eine Antwort?
Bei der Fragestellung? 

Eigentlich ist XAMPP so konfiguriert das ein PHP-Upload ohne Problem klappt.
Um welches Uploadscript handelt es sich?

Überprüf mal per phpinfo() ob in Deiner Xampp-Version die upload-pfade gesetzt wurden und ob diese Pfade auch die passenden Rechte besitzen.

Um welches Betriebsystem handelt es sich?
Xampp gibt es für Linux, Windows und OS X!

Wenn du richtig Fragst, bekommst Du vielleicht sogar eine Antwort 

c u @ neXt abduction,
earthling


----------



## Dr Dau (12. Juli 2006)

Hallo!

Ich kenne ja Dein Script nicht.....
aber nur weil es beim Hoster funktioniert, heisst es nicht automatisch dass es auch OK ist.
Genausogut kann es nämlich auch sein dass Du nur unsauber gearbeitet hast und Dein Hoster es mit der Sicherheit nicht so genau nimmt.  

Gruss Dr Dau


----------



## PhoenixDH (12. Juli 2006)

Hat sich erledigt, es funktioniert jetzt alles, habs aber online an nem Testscsript getestet!


----------



## Kipperlenny (16. Juli 2006)

Sorry, dass ich hier so reinplatze - aber ich habe genau das gleiche Problem.

Mein Script:


```
if($file1)
 {
$dname=explode(".",$file1_name);
$dnamesize=count($dname);
$file1_ext=$dname[$dnamesize-1];
$picext=$file1_ext;
if($picext=="gif" or $picext=="jpg")
{
				copy($file1, "./pics/".$file1_name."");
				chmod ("./pics/".$file1_name."", 0777);
				$db->query("INSERT INTO bilder VALUES ('','./pics/$file1_name','$time')");
echo "Photo 1 erfolgreich gespeichert!<br />";
}
else
{
echo "Photo 1: bitte nur .jpg oder .gif datein hochladen!<br />";
}
}
```

Im Web funktioniert das alles super - mein xampp macht nichts - habe mich auch schon gewundert woran das liegen könnte. Ich habe die neueste xampp Version für Windows (XP SP2).

Die Upload Pfade richtig setzen? Hm, das hört sich für mich so an, als würde er nur in einen Ordner laden können danach - ist ja blödsinnig 

Also, da wäre ich für eine Lösung auch noch dankbar - PS: Ich dachte zuerst, dass es daran liegt, dass mein "pics" ordner keine rechte 777 oder ähnliches hat - nur einstellen auf dem PC kann man das ja schlecht...


----------



## Dr Dau (16. Juli 2006)

@Kipperlenny
Wo kommt $file1 und $file1_name her?
Wo kommt ggf. $time her?

Windows kennt kein CHMOD. 

Den Dateityp an hand der Dateiendung zu identifizieren kannst Du Dir auch gleich sparen..... ein einfaches umbenennen der Datei langt und ich kann hochladen was ich will.
Überprüfe die Datei lieber an dem ohnehin schon übermittelten Mimetype und vergleiche ihn mit den von Dir erlaubten Dateitypen.

Alles in allem: stöber mal ein wenig im Forum nach Dateiuploads.


----------



## Kipperlenny (16. Juli 2006)

@dr dau, das Script ist nicht dazu gedacht, dass andere Leute da was hochladen - da lade nur ich hoch  es wird also keiner Datein umbennen und da hochladen.
Aber sobald ich sowas mal für die Öffentlichkeit baue werde ich mich weiter informieren.

$file1 kommt halt von dem Formular der html Datei wo man das Bild hochläd, $file1_name dachte ich immer wäre einfach nur der Name der Datei - kommt also nirgends her... und $time=time()

aber woran liegt es denn nun, dass xampp das nicht macht?


----------



## Dr Dau (16. Juli 2006)

Kipperlenny hat gesagt.:
			
		

> $file1 kommt halt von dem Formular der html Datei wo man das Bild hochläd ..... aber woran liegt es denn nun, dass xampp das nicht macht?


Habe ich es mir doch fast gedacht.
Für Dich zählt also auch mein erstes Posting.
Stichworte: register_globals=OFF und $_FILES.

Klar, Du könntest Deine Serverkonfiguration auch "verschlimmbessern", nur solltest Du bedenken dass Dein Hoster seine Konfiguration auch jederzeit ändern könnte (und es hoffentlich auch bald mal macht)..... und dann wird Dein Script auch bei ihm nicht mehr funktionieren. 

Wo wir schon dabei sind..... setze mal ganz zu Anfang Deines Scripts ein error_reporting(E_ALL); ein..... dann wirst Du mit grosser Wahrscheinlich noch einen Hinweis (Notice) angezeigt bekommen.
Ungefähr sowas wie z.b. "Notice: Undefined variable: file1 in.....".


----------



## Neurodeamon (16. Juli 2006)

> Die Upload Pfade richtig setzen? Hm, das hört sich für mich so an, als würde er nur in einen Ordner laden können danach - ist ja blödsinnig



Nein, das ist sehr sinnig. Der Uploadpfad ist ein in der Konfiguration vorgegebenes Verzeichnis wo die Dateien beim Hochladen landen (temporär) bevor man sie mit PHP weiterverarbeitet. Die Dateien sind z. B. mit $_FILES ansprechbar (DrDau hat es schon erwähnt) und mit Befehlen wie move_uploaded_file() aus dem temporären Verzeichnis in das entgültige Verzeichnis verschiebbar.

Setz mal


```
error_reporting(E_ALL); 
ini_set('display_errors', TRUE);
```

ganz oben vor das Uploadscript.

Und was sagt das:

```
print_r($_FILES );
```

Ich weise nochmal darauf hin: Hilfe kann man nur bekommen, wenn man auch sein Problem SCHILDERT und alle wichtigen Daten liefert. Sollen wir hier rumraten? Kristallkugeln sind teuer!

Und wenn sich jemand dazu entscheidet helfen zu wollen, sollte sich der Fragende nicht einfach so zurückziehen und sagen "Passt schon, brauch keine Hilfe mehr. Hab's anders gelöst." Wenn er das nächste Mal fragt, wird sich sicherlich der eine oder andere daran erinnern und eventuell nicht antworten, weil er annimmt das der Fragende eh wieder den Schwanz einzieht ;-] 

Und etwas "blödsinnig" nennen, weil man es nicht versteht ... ist ... dumm ...
Nachfragen ist der Schlüssel zum Verstehen.
Vielleicht wäre es auch mal wieder angebracht die PHP-Dokumentation zu lesen?


----------



## Kipperlenny (17. Juli 2006)

@Neurodeamon,

Ich glaube du hast meinen Tonfall (welchen es beim Schreiben ja nur indirekt gibt) ein wenig falsch verstanden 

Mit "blödsinnig" meinte ich nicht die Antwort oder ähnliches, sondern meinen Gedankengang - was gleichzeitig eine Frage sein sollte:



> Die Upload Pfade richtig setzen? Hm, das hört sich für mich so an, als würde er nur in einen Ordner laden können danach - ist ja blödsinnig



Der erste Satz enthält sogar ein "?" welches zeigen sollte, dass ich das nicht verstehe - Satz danach ist einfach nur mein Gedankengang und das "FALSE" Ende in meinem Kopf wodurch ich gerne noch mal eine genauere Erklärung hätte 

Das mit dem "nicht genügend Informationen geben" und "Frage geklärt" war wahrscheinlich nicht auf mich bezogen - ich hatte extra einen Mod angeschrieben um den Thread wieder zu "entmarkieren". Und ich hatte echt versucht alle Informationen zu geben die ich so habe (Script gepostet etc.).

Und die PHP-Doku kann man sein Leben lang jeden Tag lesen - und wird trotzdem kein PHP können


----------



## Neurodeamon (17. Juli 2006)

@kipperlenny: Ich habe es auch nicht wirklich böse aufgefasst, sonst hätte ich nämlich gar nicht erst geantwortet  Und ja, Du hast Recht, man kann bei geschriebenem halt nur einen bestimmten 'Tonfall' annehmen.

Meine letzten Angaben solltest Du ausprobieren und mir das Ergebnis nennen. Aus Erfahrung kann ich sagen das PHP meist sehr aussagekräftige Fehlermeldungen von sich gibt.


----------



## Kipperlenny (17. Juli 2006)

Na jetzt sagt ihr mit bestimmt gleich, dass mein gesamtes Script Schrott ist 

Also, einmal auch ohne Hochladen (html form) zeigt er schon mal diese Fehler an:
Übrigens ist die erste Variable jetzt "$_FILE1" weil ich das mal ausprobiert habe...


```
Notice: Undefined variable: _FILE1 in C:\xampp\htdocs\david\Ainhalt.inc.php on line 65

Notice: Undefined variable: file2 in C:\xampp\htdocs\david\Ainhalt.inc.php on line 83

Notice: Undefined variable: file3 in C:\xampp\htdocs\david\Ainhalt.inc.php on line 101

Notice: Undefined variable: file4 in C:\xampp\htdocs\david\Ainhalt.inc.php on line 119

Notice: Undefined variable: file5 in C:\xampp\htdocs\david\Ainhalt.inc.php on line 137
```

Und nach dem Hochladen (welches ja nicht stattfindet) :


```
Array ( [file1] => Array ( [name] => RK_deutsch_ss2.JPG [type] => image/pjpeg [tmp_name] => C:\xampp\tmp\php26.tmp [error] => 0 [size] => 113992 ) [file2] => Array ( [name] => RK_deutsch_ss2.JPG [type] => image/pjpeg [tmp_name] => C:\xampp\tmp\php27.tmp [error] => 0 [size] => 113992 ) [file3] => Array ( [name] => [type] => [tmp_name] => [error] => 4 [size] => 0 ) [file4] => Array ( [name] => [type] => [tmp_name] => [error] => 4 [size] => 0 ) [file5] => Array ( [name] => [type] => [tmp_name] => [error] => 4 [size] => 0 ) )
```

ps: ich habe jetzt nur 2 Datein versucht hochzuladen - möglich sind 5 - deswegen sind die Arrays 3-5 leer!


----------



## Neurodeamon (17. Juli 2006)

Okay, als erstes: Don't mess with the server variables. Die Variable $_FILES ist vorgegeben, am besten nennst Du *keine* eigenen Variablen so oder so ähnlich (und besonders nicht mit Unterstirch "_". Kein Wunder das es Fehlermeldungen hagelt! 



> Und nach dem Hochladen (welches ja nicht stattfindet) :


Das ist nicht korrekt, an der Ausgabe des Arrays $_FILES kannst Du sehen, das der Server die Daten in einen Ordner für temporäre Dateien erhält (C:\xampp\tmp\), welches übrigens der in der Konfiguration vorgegebene Wert ist (den ich vorhin erwähnt habe, da landen alle Uploads). Also funktioniert der Upload, Du verarbeitest den Upload aber nicht richtig!

Jetzt mußt Du mit dem Befehl move_uploaded_file() die Datei aus dem temporären Verzeichnis an die gewünschte Position im Dateisystem verschieben.

Ein Beispiel:

```
$uploaddir = 'uploads/';
foreach ($_FILES as $datei){
$uploadfile = $uploaddir . basename($datei['userfile']['name']);
move_uploaded_file($datei['userfile']['tmp_name'], $uploadfile);
}
```

So, es ist fast fünf Uhr morgens. Ich hoffe mal das ich mich nicht vertan habe 
Alle hochgeladenen Dateien sollten von diesem Schnipsel in den Ordner 'uploads' kopiert werden mit dem Dateinamen den sie beim Hochladen hatten. Laut Deinem Beispiel:

```
uploads/RK_deutsch_ss2.JPG
```
Es ist natürlich nur eine Datei, da alle Dateien mit gleichem Namen die hochgeladen werden, bestehende Dateien überschreiben!

Zum Nachlesen *Beispiel 38-2*:
http://de2.php.net/manual/en/features.file-upload.php
Und der Befehl:
http://de2.php.net/move_uploaded_file

Nur nochmal dazu:


> Und die PHP-Doku kann man sein Leben lang jeden Tag lesen - und wird trotzdem kein PHP können


Du mußt nicht jeden Tag in der Doku lesen. Aber wenn Du etwas erledigen willst, kannst Du sehr gut recherchieren, da die Doku sehr viele Beispiele enthält und Du nach und nach die Funktionsweise der Befehle lernst. Das ist nicht viel arbeit, schau Dir immer nur an was Du gebrauchen könntest, was für Dein anstehendes Problem hilfreich sein könnte und Du wirst Seite für Seite besser - nur Mut!


----------



## Kipperlenny (17. Juli 2006)

so....

das hier ist jetzt der Code:


```
echo "<h2>Photos hochladen</h2>
<form action=\"./admin.php?action=bilder&aktion=".$check."&id=".$id."\" method=\"post\" enctype=\"multipart/form-data\">
Nur Gif und Jpg Dateien mit einer Größe von max. 2000kb:
<input type=\"file\" name=\"pictures[]\" size=\"50\"/><br />
<input type=\"file\" name=\"pictures[]\" size=\"50\"/><br />
<input type=\"file\" name=\"pictures[]\" size=\"50\"/><br />
<input type=\"file\" name=\"pictures[]\" size=\"50\"/><br />
<input type=\"file\" name=\"pictures[]\" size=\"50\"/><br />
<input type=\"submit\" value=\"Speichern\">
</p>
</form>";
 foreach ($_FILES["pictures"]["error"] as $key => $error) {
   if ($error == UPLOAD_ERR_OK) {
       $time=time();
       $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
       $name = $_FILES["pictures"]["name"][$key];
       move_uploaded_file($tmp_name, "./pics/$name");
       chmod ("./pics/".$name."", 0777);
	   $db->query("INSERT INTO bilder VALUES ('','$name','$time')");
	   echo $name." erfolgreich hochgeladen!<br />";
   }
```

und das hier die Meldung die er ausgibt beim hochladen im Netz (funktioniert alles super) :


```
Array ( [pictures] => Array ( [name] => Array ( [0] => image1.jpg [1] => image2.jpg [2] => image3.jpg [3] => [4] => ) [type] => Array ( [0] => image/pjpeg [1] => image/pjpeg [2] => image/pjpeg [3] => [4] => ) [tmp_name] => Array ( [0] => /tmp/phpTeuZIv [1] => /tmp/phpurCraZ [2] => /tmp/php9fvAUG [3] => [4] => ) [error] => Array ( [0] => 0 [1] => 0 [2] => 0 [3] => 4 [4] => 4 ) [size] => Array ( [0] => 2592 [1] => 4240 [2] => 5101 [3] => 0 [4] => 0 ) ) )
```

und wenn ich auf die Page klicke bei xampp kommt diese Meldung (Hochladen klappt jetz aber super!) :


```
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\david\Ainhalt.inc.php on line 74
Array ( [pictures] => Array ( [error] => ) )
```

und nach dem Hochladen:


```
Array ( [pictures] => Array ( [name] => Array ( [0] => image4.jpg [1] => image3.jpg [2] => [3] => [4] => ) [type] => Array ( [0] => image/pjpeg [1] => image/pjpeg [2] => [3] => [4] => ) [tmp_name] => Array ( [0] => C:\xampp\tmp\php36.tmp [1] => C:\xampp\tmp\php37.tmp [2] => [3] => [4] => ) [error] => Array ( [0] => 0 [1] => 0 [2] => 4 [3] => 4 [4] => 4 ) [size] => Array ( [0] => 8284 [1] => 5101 [2] => 0 [3] => 0 [4] => 0 ) ) )
```


----------



## Neurodeamon (17. Juli 2006)

Ich nehme an das Du uploadscript und uploadformular im selben Dokument stehen hast. Beim normalen (vor dem Upload) sollte definitiv der Fehler kommen da foreach kein Array bekommt (da unser $_FILES erst nach dem Upload gefüllt wird).
Du solltest den Inhalt trennen. Entweder indem Du Formular und Script in unterschiedliche Dateien schreibst oder indem Du den Inhalt in der einen Datei trennst trennst.

Beispiel:

```
<?php
$wassollichtun = $_GET['wastun'];
switch($wassollichtun){
case "post":
 // hier kommt das upload script rein
break;
default:
echo "<h2>Photos hochladen</h2>
<form action=\"./admin.php?action=bilder&wastun=post&aktion=".$check."&id=".$id."\" method=\"post\" enctype=\"multipart/form-data\">
Nur Gif und Jpg Dateien mit einer Größe von max. 2000kb:
<input type=\"file\" name=\"pictures[]\" size=\"50\"/><br />
<input type=\"file\" name=\"pictures[]\" size=\"50\"/><br />
<input type=\"file\" name=\"pictures[]\" size=\"50\"/><br />
<input type=\"file\" name=\"pictures[]\" size=\"50\"/><br />
<input type=\"file\" name=\"pictures[]\" size=\"50\"/><br />
<input type=\"submit\" value=\"Speichern\">
</p>
</form>";
}
?>
```

Das ist jetzt ein ganz grobes Beispiel. Das Formular ruft die PHP-Datei mit einem weiteren Befehl in der URL auf. Im Beispiel *wastun=post*. Sobald die Variable *wassollichtun* gleich "post" ist, wird der upload verwarbeitet. Wenn wastun gar nicht oder mit anderen Daten gefüttert wird, wird das Formular aufgerufen ohne die Upload-Prozedur durchzuarbeiten solange es keine Daten bekommt.

Ich hoffe ich schreibe nicht zu verworren. Bin ein bissl müde 

Vermutlich ist auf dem Server die Fehlerausgabe etwas restriktiver eingestellt und der Server beschwert sich zumindest nicht sichtbar. Xampp ist allerdings eher als Entwicklungsumgebung gedacht, da ist es besser wenn es jeden Fehler sichtbar macht.


----------



## Kipperlenny (17. Juli 2006)

hm, danke dir für deine ausführliche Antwort - aber diesmal hätte auch ein "Du dummer Typ du, leg dich ins Bett, steh wieder auf und schau selber woran es liegt!" völlig ausgereicht.

Das hätte ich jetzt eigentlich schon selber wissen müssen - arbeite ja schon die ganze zeit mit "action" etc. im Link...

Gut gut, dann änder ich das noch und dann sollte alles fertig sein. Ich danke dir!
Am meißten nervt mich momentan nur, das mein Kumpel später anrufen wird: "Du hast ja schon wieder nichts an der Seite gemacht" Weil er ja von den 5 Stunden Arbeit heute Nacht nichts zu sehen bekommt...


----------



## Dr Dau (17. Juli 2006)

Kipperlenny hat gesagt.:
			
		

> und wenn ich auf die Page klicke bei xampp kommt diese Meldung.....


Nun, foreach() wird ja auch ausgeführt wenn das Formular nicht abgeschickt wurde.
Und wenn das Formular nicht abgeschickt wurde, dann ist halt auch das Array von $_FILES leer.
Wenn $_FILES nun aber leer ist, wie soll foreach() dann ein as $key draus machen?! 
Du solltest also zuerst prüfen ob das Formular abgeschickt wurde.
Dann solltest Du prüfen ob $_FILES leer ist..... und dann erst foreach() ausführen.

Ich stelle es mir ja eher so vor (müsstest Du aber noch anpassen):

```
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<?php
$upload_felder = "5";
 
for($i = 1; $i <= $upload_felder; $i++) {
    echo '  <input type="file" name="file['.$i.']" /><br />';
}
?>
    <input type="submit" name="upload" value="Hochladen" /><br />
</form>
 
<?php
if(isset($_POST['upload'])) {
    $i = 1;
    while($i <= count($_FILES['file'])) {
        if(!empty($_FILES['file']['name'][$i])) {
            if( ($_FILES['file']['type'][$i] == "image/pjpeg") OR ($_FILES['file']['type'][$i] == "image/jpeg") OR ($_FILES['file']['type'][$i] == "image/gif") ) {
                move_uploaded_file($_FILES['file']['tmp_name'][$i], "./pics/".$_FILES['file']['name'][$i]);
                chmod("./pics/".$_FILES['file']['name'][$i], 0644);
                echo $_FILES['file']['name'][$i].": erfolgreich hochgeladen!<br />";
            } else {
                echo $_FILES['file']['name'][$i].": bitte nur .jpg oder .gif datein hochladen!<br />";
            }
        }
    $i++;
    }
}
?>
```


----------



## Neurodeamon (17. Juli 2006)

@Kipperlenny:
Undank ist der Welt Lohn 

@DrDau:
Wie immer fleissig


----------

