Mehrfacher Upload

sugar

Erfahrenes Mitglied
Jetzt habe ich noch eine Frage: und zwar habe ich ein upload Formular mit dem mehrere Files auf einmal hochgeladen werden. Klappt soweit auch ganz gut. Jetzt möchte ich aber noch eine Überprüfung durchführen, so ähnlich hatte ich es schon mal mit einem einzelnen Upload Form gemacht aber ich weiß nicht wie ich es für das Multi Upload Formular anpasse! Hier sowiet der Code:

PHP:
if ($do=="save") {

$tempname1 = $HTTP_POST_FILES['ufile']['tmp_name'][0]; 
$tempname2 = $HTTP_POST_FILES['ufile']['tmp_name'][1]; 
$tempname3 = $HTTP_POST_FILES['ufile']['tmp_name'][2]; 
$tempname4 = $HTTP_POST_FILES['ufile']['tmp_name'][3]; 
$tempname5 = $HTTP_POST_FILES['ufile']['tmp_name'][4]; 
$tempname6 = $HTTP_POST_FILES['ufile']['tmp_name'][5]; 

$name1= "../wohnungen_mieten/objekte/".$HTTP_POST_FILES['ufile']['name'][0];
$name2= "../wohnungen_mieten/objekte/".$HTTP_POST_FILES['ufile']['name'][1];
$name3= "../wohnungen_mieten/objekte/".$HTTP_POST_FILES['ufile']['name'][2];
$name4= "../wohnungen_mieten/objekte/".$HTTP_POST_FILES['ufile']['name'][3];
$name5= "../wohnungen_mieten/objekte/".$HTTP_POST_FILES['ufile']['name'][4];
$name6= "../wohnungen_mieten/objekte/".$HTTP_POST_FILES['ufile']['name'][5];

$type1= $HTTP_POST_FILES['ufile']['type'][0]; 
$type2= $HTTP_POST_FILES['ufile']['type'][1]; 
$type3= $HTTP_POST_FILES['ufile']['type'][2]; 
$type4= $HTTP_POST_FILES['ufile']['type'][3]; 
$type5= $HTTP_POST_FILES['ufile']['type'][4]; 
$type6= $HTTP_POST_FILES['ufile']['type'][5]; 

$size1= $HTTP_POST_FILES['ufile']['size'][0]; 
$size2= $HTTP_POST_FILES['ufile']['size'][1]; 
$size3= $HTTP_POST_FILES['ufile']['size'][2]; 
$size4= $HTTP_POST_FILES['ufile']['size'][3]; 
$size5= $HTTP_POST_FILES['ufile']['size'][4]; 
$size6= $HTTP_POST_FILES['ufile']['size'][5]; 

$type = array($type1,$type2,$type3,$type4,$type5,$type6);
$name = array($name1,$name2,$name3,$name4,$name5,$name6);
$size = array($size1,$size2,$size3,$size4,$size5,$size6);

if($type != "image/gif" && $type != "image/pjpeg" && $type != "image/jpeg") { 
    $err[] = "nur gif und jpeg Dateien dürfen hochgeladen werden."; 
} 

if (file_exists("$name")) {
	$err[] = "Eine odere mehrere Dateien die Sie hochladen möchten existieren bereits! Bitte verwenden Sie einen anderen Namen!"; 
} 
if($size > "150000") { 
    $err[] = "Eine odere mehrere Dateien die Sie hochladen möchten sind zu groß!<br>Maximale Dateigrosse beträgt 150 KB!"; 
}
//copy file to where you want to store file
if(empty($err)) { 
    copy("$tempname1", "$name1"); 
	copy("$tempname2", "$name2"); 
	copy("$tempname3", "$name3"); 
	copy("$tempname4", "$name4"); 
	copy("$tempname5", "$name5"); 
	copy("$tempname6", "$name6"); 
    echo "Die Datei $name wurde erfolgreich hochgeladen!"; 

}
else { 
    foreach($err as $error) 
    echo "$error<br>"; 

}
}
 
Puhh...einen multiple Upload hättest Du mit einem Bruchteil der Variablen realisieren können im dem Du mit Arrays arbeitest. Was eine Überprüfung somit auch kinderleicht macht UND Du musst nicht zig Variablen Hardcoden!

Uploadfelder wie folgt benennen.
HTML:
<input type="file" name="fupload[]" />
Beispiel für 5 Uploadfelder
PHP:
for($i=0;$i<5;$i++){
     print '<p><input type="file" name="fupload[]" /></p>';
}
und das ganze dann mit PHP foreach durchlaufen. Hier werden automatisch alle Felder durchlaufen die es gibt, da vom Formular ein Array kommt. Innerhalb dieser foreach Schleife kannst Du beliebige Abfragen machen, wie die im Beispielcode.
PHP:
$i = 0;

foreach($_FILES["fupload"] as $data){
     #Prüfen ob die Datei mittels POST hochgeladen wurde. For security reason!
     if(is_uploaded_file($_FILES["fupload"] ["tmp_name"][$i])){
          #Prüfung ob Dateigröße größer als 0 ist
          if($_FILES["fupload"] ["size"][$i] != 0){
              #Prüfen ob die hochgeladene Dateityp erlaubt ist
              if($_FILES["fupload"] ["type"][$i] == "image/jpeg"){
                  #Datei verschieben
                  move_uploaded_file(string $filename, string $destination);

                  #Hier DB Eintrag
                  $query = "INSERT INTO....";
              }
          }
     }
$i++;
}
Quasi als Beispiel...wollte Dein Rad nicht neu erfinden...aber vielleicht einen Denkanstoß geben. Hardcoding mit tausend Variablen ist sehr schlecht wartbar und auch schrecklich unübersichtlich.

http://de3.php.net/manual/de/features.file-upload.multiple.php
 
Zuletzt bearbeitet:
Danke! Das werde ich mal versuchen. Ich weiß nur nicht so genau wie ich es dann mache, dass ich die einzelnen Daten in die DB eintrage? Ich habe sonst jedes Bild in einer Datenbank gespeichert und das brauche ich auch weiterhin?

Kann ich das array dann wieder einzeln auslesen?

Danke
sugar
 
Diese Schleife läuft so oft ab wie Uploadfelder vorhanden sind. Das heißt Du kannst so pro File/Durchlauf auch einen DB Eintrag machen. Hab oben den Code noch mal editiert.
 
Zuletzt bearbeitet:
Danke für deine Hilfe aber das hab ich nicht ganz vestanden. Ich habe das ganze nun folgendermaßen gemacht:

PHP:
if ($do=="save") {

$uploadNeed = $_POST['uploadNeed'];
// start for loop
for($x=0;$x<$uploadNeed;$x++){

$file_name = "../wohnungen_mieten/objekte/".$_FILES['ufile'. $x]['name'];
$file_type = $_FILES['ufile'. $x]['type']; 
$file_size = $_FILES['ufile'. $x]['size']; 

// checking
if($file_type != "image/gif" && $file_type != "image/pjpeg" && $file_type != "image/jpeg") { 
    $err[] = "nur gif und jpeg Dateien dürfen hochgeladen werden."; 
} 
if (file_exists("$file_name")) {
	$err[] = "Die Datei $file_name ist bereits vorhanden!"; 
} 
if($file_size > "150000") { 
    $err[] = "Die Datei welche du hochladen willst, ist zu gross!<br>Maximale Dateigrosse beträgt 150 KB!"; 
}
// checking ende
if(empty($err)) { 
    $file_copy = copy($_FILES['ufile'. $x]['tmp_name'],$file_name);
	
    echo "Die Datei $file_name wurde erfolgreich hochgeladen!<br>"; 

// Bild verkleinern
  
$PicPathIn="../wohnungen_mieten/objekte/"; // Hier gebt ihr den Ordner an, wo sich die vollen bilder befinden.

$PicPathOut="../wohnungen_mieten/objekte/thumb/"; // Hier in diesen ordner wird das Bild nachher gespeichert. 

/** Orginalbild **/
$bild_neu= $_FILES['ufile'. $x]['name']; // Hier den Namen eingeben, wie das Bild in dem ausgewählten Ordner heißt
/** Bilddaten feststellen **/
$size=@getimagesize("$PicPathIn"."$bild_neu"); // Hierbei wird ermittelt, wie groß das Bild ist (Höhe, Breite und Typ [Typ wird in diesem tut allerdings nicht benutzt])
$breite=$size[0]; // Die Breite des alten Bildes wird in eine Variable geladen
$hoehe=$size[1]; // Die Höhe des alten Bildes wird in eine Variable geladen
$neueBreite=150; // die Variablen sagen alles
$neueHoehe=113; // hierbei könnte man exakt berechnen, wie hoch es verglichen mit dem alten Bild sein soll aber das habe ich hier jetzt erstmal noch nicht gemacht

/** JPG thumbnail erzeugen **/
$altesBild=ImageCreateFromJPEG("$PicPathIn"."$bild_neu"); // Das große Bild wird für den späteren Prozess erstellt.

$neuesBild=imageCreateTrueColor($neueBreite,$neueHoehe); // mit dieser Funktion wird das Bild also für die passenden Farben erstellt.
@imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe); // Das Bild wird kopiert und danach verkleinert
@ImageJPEG($neuesBild,"$PicPathOut".""."$bild_neu"); // Das Bild wird gespeichert. Zwischen den 2 Anführungszeichen kann man noch bspw. tn_ hinsetzen, damit man das bild im selben Ordner speichern kann (bsp. screen.jpg - tn_screen.jpg)

//Bilder verkleinern Ende


 }
else { 
    foreach($err as $error) 
    echo "$error<br>"; 

}
} // end of loop

}

Kannst du mir helfen wie ich die einzelnen Bilder nun in die Datenbank bekomme? Ich habe in der Datenbank je ein Feld für "bild1", "bild2", etc.

Danke!
 
Verwende doch die foreach von oben. Dort mache ich doch ähnliche Überprüfungen wie Du. Also in Deinem Beispiel:

PHP:
$i = 0;

foreach($_FILES["fupload"] as $data){
     #Prüfen ob die Datei mittels POST hochgeladen wurde. For security reason!
     if(is_uploaded_file($_FILES["fupload"] ["tmp_name"][$i])){
          #Prüfung ob Dateigröße größer als 0 ist
          if($_FILES["fupload"] ["size"][$i] <= 150000){
              #Prüfen ob die hochgeladene Dateityp erlaubt ist
              if($_FILES["fupload"] ["type"][$i] == "image/jpeg" && $_FILES["fupload"] ["type"][$i] == "image/pjpeg" && $_FILES["fupload"] ["type"][$i] == "image/gif"){
                   #Dieser Block hier wird pro Bild jedes mal abgearbeitet, sprich Du kannst hier 
                   #die Datenbankeinträge oder Bildveränderungen machen
                  // Bild verkleinern    
                   $PicPathIn="../wohnungen_mieten/objekte/"; // Hier gebt ihr den Ordner an, wo sich die vollen bilder befinden. 
                   $PicPathOut="../wohnungen_mieten/objekte/thumb/"; // Hier in diesen ordner wird das Bild nachher gespeichert.  

                   /** Orginalbild **/ 
                   $bild_neu= $_FILES['fupload']['name'][$i]; // Hier den Namen eingeben, wie das Bild in dem ausgewählten Ordner heißt 
                   /** Bilddaten feststellen **/ 
                   $size=@getimagesize("$PicPathIn"."$bild_neu"); // Hierbei wird ermittelt, wie groß das Bild ist (Höhe, Breite und Typ [Typ wird in diesem tut allerdings nicht benutzt]) 
                   $breite=$size[0]; // Die Breite des alten Bildes wird in eine Variable geladen 
                   $hoehe=$size[1]; // Die Höhe des alten Bildes wird in eine Variable geladen 
                   $neueBreite=150; // die Variablen sagen alles 
                   $neueHoehe=113; // hierbei könnte man exakt berechnen, wie hoch es verglichen mit dem alten Bild sein soll aber das habe ich hier jetzt erstmal noch nicht gemacht 

                   /** JPG thumbnail erzeugen **/ 
                   $altesBild=ImageCreateFromJPEG("$PicPathIn"."$bild_neu"); // Das große Bild wird für den späteren Prozess erstellt. 

                   $neuesBild=imageCreateTrueColor($neueBreite,$neueHoehe); // mit dieser Funktion wird das Bild also für die passenden Farben erstellt. 
                  @imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);                   // Das Bild wird kopiert und danach verkleinert 
                   @ImageJPEG($neuesBild,"$PicPathOut".""."$bild_neu"); // Das Bild wird gespeichert. Zwischen den 2 Anführungszeichen kann man noch bspw. tn_ hinsetzen, damit man das bild im selben Ordner speichern kann (bsp. screen.jpg - tn_screen.jpg)

                   #Hier ein Beispiel DB Eintrag
                  mysql_query("INSERT INTO pics (name) VALUES ('".$bild_neu."')";

              }else{
                  print "Dieser Dateityp ist nicht erlaubt";
              }
          }else{
             print "Die Datei ist zu groß!";
          }
     }
$i++;
}

Pro Bild wird hier ein Datensatz in die Tabelle geschrieben mit dem Dateinamen den Du später wieder verwenden kannst.

Aber Voraussetzung hierfür ist das das Formularfeld ein Array ist.
HTML:
<input type="file" name="fupload[]" />
 
Wow danke für deine Mühe!

Ich habe nur das Problem, dass ich nicht in dieser Schleife die Bilder speichern will, sondern an einer anderen Stelle! Deswegen hatte ich sie vorher in Variablen gepackt. Das ginge ja mit dem Array schlecht oder?
 
Jede Aktion die Du machen willst kannst Du innerhalb dieser Schleife machen die ja pro Datei durchlaufen wird. Macht ja keinen Sinn das an andere Stelle zu machen.

Wie gesagt...je nachdem wie viel Files hochgeladen werden so oft wird das Ding durchlaufen. Daher bietet es sich ja auch an innerhalb dieses Blockes sämtliche Aktionen durchzuführen. Umbenennen, Größe bearbeiten, im Filesystem verschieben etc. und am Ende halt noch in die DB schreiben. Was Du willst.
 
Zurück