Upload mehrerer Dateien klappt nicht

Ich kriegs nich hin mein kleines Uploadscript für mehrere Inputfelder umzubasteln.

So schauts aus:
PHP:
<?php
include('language.php');

$tempname = $_FILES['file']['tmp_name'];
$name = $_FILES['file']['name'];
$path_info = pathinfo ("{$name}");
$filename = sprintf('pic_%08d_%d.%s', rand(0, 99999999), date('dmY'), $path_info['extension']);
$size = $_FILES['file']['size'];
$info = getimagesize ("{$tempname}");
$width = $info['0'];
$height = $info['1'];
$type = $info['2'];

if($type != "1" && $type != "2") {
    $err[] = $lang_error_type;
}
if($width > "800") {
    $err[] = $lang_error_width;
}
if($height > "600") {
    $err[] = $lang_error_height;
}
if($size > "100000") {
    $err[] = $lang_error_size;
}

if(empty($err)) {
    copy("$tempname", "pics/$filename");
    echo $lang_upload_success;
    echo "<br><a href=\"http://www.***.de/test/\">zurück</a>";
}
else {
    foreach($err as $error)
    echo "$error<br>";
    echo "<br><a href=\"http://www.***.de/test/\">zurück</a>";
}
?>
Ich habs hiermit mal versucht anzupassen aber das klappt nich so wie es soll. Diese ganze Arraygeschichte will mir noch nich so ganz in den Kopf. Meine erster Ansatz war haufenweise inputfelder mit neuen namen zu nehmen und das Script einfach wieder und wieder unten anzuhängen aber das erschien dann sogar mir extrem blöd.

Mag mir das nochmal jemand für doofe erklären? :rolleyes:
 
Zum Uploaden mehrerer Datein solltest du es mal mit foreach versuchen...
z.B. foreach($_FILES as $files) { UPLOADROUTINE }
Und die Parameter in der Rutine dann natürlich auch von $_FILES in $files ändern...
Damit lassen sich schno mal mehrere Datein behandeln...

Und was das Auswählen mehrerer Datein angeht, hänge ich dir mal nen JS an, den ich, glaube ich sogar hier, gefunden habe...

http://gabriel86.ga.funpic.de/test/FileUpload.html

rechts klick auf den Link und dann "Ziel speichern unter..."
 
Naja das auswählen is nich das problem, da knall ich einfach mehrere inputfelder hintereinander.

Was ich nich auf die reihe bekomm is in welcher Anordnung das alles muss.
 
Einfach mehrere Input-Felder hinternander knallen ist Müll^^
Denn wenn nicht alle Felder ausgefüllt sind, werden die leeren trotzdem mit übergeben, wodurch der Server versucht nicht existierende Datein hochzuladen und dir in der DB ganz viel Platz nimmt^^

Es komm natürlich auch darauf an, was du hochladen willst...
Für EIN Bild als Beispiel mein Skript:
Code:
$errors = array();
// Uploadfehler prüfen
switch ($_FILES['pic']['error']){
case 1: $errors[] = "Bitte wählen Sie eine Datei aus, die kleiner als 350 KB ist.";
break;
case 2: $errors[] = "Bitte wählen Sie eine Datei aus, die kleiner als 350 KB ist.";
break;
case 3: $errors[] = "Die Datei wurde nur teilweise hochgeladen.";
break;
case 4: $errors[] = "Es wurde keine Datei ausgewählt.";
break;
default : break;
}
// Prüfen, ob eine Grafikdatei vorliegt
if(!@getimagesize($_FILES['pic']['tmp_name']))
$errors[] = "Ihre Datei ist keine gültige Grafikdatei.";
else {
// Mime-Typ prüfen
$erlaubte_typen = array('image/pjpeg',
'image/jpeg',
'image/gif',
'image/png'
);
if(!in_array($_FILES['pic']['type'], $erlaubte_typen))
$errors[] = "Der Mime-Typ ihrer Datei ist verboten.";

// Endung prüfen
$erlaubte_endungen = array('jpeg',
'jpg',
'gif',
'png'
);
// Endung ermitteln
$endung = strtolower(substr($_FILES['pic']['name'], strrpos($_FILES['pic']['name'], '.')+1));
if(!in_array($endung, $erlaubte_endungen))
$errors[] = "Die Dateiendung muss .jpeg .jpg .gif oder .png lauten ";

// Ausmaße prüfen
$size = getimagesize($_FILES['pic']['tmp_name']);
if ($size[0] > 250 OR $size[1] > 350)
$errors[] = "Die Datei darf maximal 250 Pixel breit und 350 Pixel hoch sein.";
}
// Dateigröße prüfen
if($_FILES['pic']['size'] > 358400)
$errors[] = "Bitte w&auml;hlen Sie eine Datei aus, die kleiner als 350 KB ist.";

if(count($errors)){
echo "Ihr Avatar konnte nicht gespeichert werden.<br>\n".
"<br>\n";
foreach($errors as $error)
echo $error."<br>\n";
echo "<br>\n".
'Zurück zum <a href="'.$_SERVER['PHP_SELF'].'?page=user">Profil</a>'."\n";
}
else {
// Bild auf dem Server speichern
$uploaddir = 'avatare/';
// neuen Bildname erstellen
$Name = "IMG_".substr(microtime(),-8).".".$endung;
if (move_uploaded_file($_FILES['pic']['tmp_name'], $uploaddir.$Name)) {
$sql = "UPDATE
User
SET
Avatar = '".mysql_real_escape_string(trim($Name))."'
WHERE
ID = ".$_SESSION['UserID']."
";
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());

echo 'Ihr Avatar wurde erfolgreich gespeichert.<br>'."\n".'Zurück zum <a href="'.$_SERVER['PHP_SELF'].'?page=edit">Profil</a>'."\n";
}
else {
echo 'Es trat ein Fehler auf, bitte versuche es später erneut.<br>'."\n".'Zurück zum <a href="'.$_SERVER['PHP_SELF'].'?page=edit">Profil</a>'."\n";
}
 
So also ich bin inzwischen soweit dass es mehrere Bilder hochlädt. Mehr als 20 sollen das ja garnich werden.

PHP:
<?php

if(isset($_REQUEST["upload"])){

    $fileid = array("0", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19");

    if(empty ($_REQUEST["fileid"])){
        $i = 1;
    }
    else{
        $i = $_REQUEST["fileid"];
    }

        foreach($_FILES as $file){

            $tempname = $file['tmp_name'];
            $name = $file['name'];
            $size = $file['size'];
            $error = $file['error'];

            $path_info = pathinfo ($name);
            $filename = sprintf('pic_%08d_%d.%s', rand(0, 99999999), date('dmY'), $path_info['extension']);

            $info = getimagesize ($file['tmp_name']);
            $width = $info['0'];
            $height = $info['1'];
            $type = $info['2'];

                if($type != "1" && $type != "2") {
                    $err[] = "Die Datei {$name} ist kein Gif oder JPG.";
                }
                if($width > "800") {
                    $err[] = "Die Datei {$name} ist zu breit!<br>Maximale Breite beträgt 800 Pixel!";
                }
                if($height > "600") {
                    $err[] = "Die Datei {$name} ist zu hoch!<br>Maximale Höhe beträgt 600 Pixel!";
                }
                if($size > "100000") {
                    $err[] = "Die Datei {$name} ist zu gross!<br>Maximale Dateigrosse beträgt 100 KB!";
                }

                if(empty($err)) {
                    copy("$tempname", "pics/$filename");
                    echo "Die Datei wurde erfolgreich hochgeladen!";
                    echo "<br><a href=\"http://www.***.de/test/\">zurück</a>";
                }
                else {
                    foreach($err as $error)
                    echo "$error<br>";
                    echo "<br><a href=\"http://www.***.de/test/\">zurück</a>";
                }
        }
}
?>
Allerdings bin ich mir auch hier nich sicher bei der Anordnung. Das ganze reagiert etwas wild. Wenn ich nur fünf Bilder auswähl, also 15 inputs leer lass sieht das so aus:

Code:
Die Datei wurde erfolgreich hochgeladen!
zurückDie Datei wurde erfolgreich hochgeladen!
zurückDie Datei wurde erfolgreich hochgeladen!
zurückDie Datei wurde erfolgreich hochgeladen!
zurückDie Datei wurde erfolgreich hochgeladen!
zurückDie Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurückDie Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.
Die Datei ist kein Gif oder JPG.

zurück
Und wenn irgendeine Datei zu gross, breit, hoch oder sonstwas is kopiert er zwar alle davor aber keine danach. Da wärs mir eigentlich lieber er würde entweder alle gültigen oder garkeine nehmen.

Aber ich seh tatsächlich langsam Licht am ende des Tunnels :D
 
Genau das verursachen die leeren Input Felder... -.-
Gugg dir oben das JavaScript an... Sobald der Upload gestartet wird, wird das letzte LEERE Feld gelöscht...
Dein Skript sieht hübsch aus... Der Fehler kommt, weil du Das Fehler-Array nicht leerst, sondern es immer nur noch voller machst^^
Setz am Anfag der Schleife, also direkt unters foreach() $err=array()...
Dann müsste es gehn^^

In dem Skript von mir wird das etwas komplexer behandelt... Ausfürlicherere Fehlerüberprüfung und so... MIME-Type check, Filesize check, Größen check und abspeicherund des Dateinamen mit nen paar Infos in ner Tabelle einer MySQL Datenbank...

Dann schau dir mein Upload-Skript oben noch mal an... Setz das in die foreach()-Schleife und änder die Variablen-Bezeichnungen...

ODER...
Hab noch einwenig Geduld und ich mach ne File fertig, die die JS-Funktion enthält UND die Upload-Routine für multible Datein als Funktion... Und dann brauchst du eigentlich nur das Formular richtig ändern^^
 
Zuletzt bearbeitet:
Javascript is so überhaupt nich mein Gebiet, aber es scheint auch so zu gehen.

Habs jetzt schon hinbekommen dass alle Dateien hochgeladen werden und er beim ersten leeren Feld stoppt.

PHP:
<?php

if(isset($_REQUEST["upload"])){

    $fileid = array("0", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19");

    if(empty ($_REQUEST["fileid"])){
        $i = 1;
    }
    else{
        $i = $_REQUEST["fileid"];
    }

        foreach($_FILES as $file){
            $error = array();
            if(trim($file['name']) == '') $error[] = 'Boing';
            if(count($error) > 0) {
                echo implode('<br />', $error);
                echo "<br><a href=\"http://www.***.de/test/\">zurück</a>";
                die();
            } else {

            $tempname = $file['tmp_name'];
            $name = $file['name'];
            $size = $file['size'];
            $error = $file['error'];

            $path_info = pathinfo ($name);
            $filename = sprintf('pic_%08d_%d.%s', rand(0, 99999999), date('dmY'), $path_info['extension']);

            $info = getimagesize ($file['tmp_name']);
            $width = $info['0'];
            $height = $info['1'];
            $type = $info['2'];

                if($type != "1" && $type != "2") {
                    $err[] = "Die Datei {$name} ist kein Gif oder JPG.";
                }
                if($width > "800") {
                    $err[] = "Die Datei {$name} ist zu breit!<br>Maximale Breite beträgt 800 Pixel!";
                }
                if($height > "600") {
                    $err[] = "Die Datei {$name} ist zu hoch!<br>Maximale Höhe beträgt 600 Pixel!";
                }
                if($size > "100000") {
                    $err[] = "Die Datei {$name} ist zu gross!<br>Maximale Dateigrosse beträgt 100 KB!";
                }

                if(empty($err)) {
                    copy("$tempname", "pics/$filename");
                    echo "Die Datei {$name} wurde erfolgreich hochgeladen!<br>";
                }
                else {
                    foreach($err as $error)
                    echo "$error<br>";
                }
        }
}
}
?>
Jetzt muss ichs nur noch hinbekommen dass wenn ein Bild die Vorgaben nicht erfüllt das nächste genommen wird. Bisher bricht er dann ab und ignoriert die weiteren.
 
Zuletzt bearbeitet:
Code:
foreach($_FILES as $file){
// ->            $err = array();
//probier mal -> $err = '';  Um das Array zu leeren.
// ->            if(trim($file['name']) == '') $err[] = 'Boing';
// ->            if(count($err) > 0) {
// ->                echo implode('<br />', $err);
                echo "<br><a href=\"http://www.***.de/test/\">zurück</a>";
                die();
            } else {

            $tempname = $file['tmp_name'];
            $name = $file['name'];
            $size = $file['size'];
// ->           $err = $file['error'];

            $path_info = pathinfo ($name);
Das Fehler-Array hast du mit $err[] bezeichnet... Also musst du es auch im gesamten Skript so nennen... Zum Schluß liest du $err[] einzeln als $error aus...
 
Zurück