2012-04-12 9 views
1

Ich habe ein Upload-Skript mit dem ich gerne ein paar Bilder in ein Verzeichnis hochladen.Wie man foreach uploaden Dateien kombiniert

ich verwende diesen Code:

$allowed_extension = array('jpg', 'jpeg', 'png', 'bmp', 'tiff', 'gif'); 
$errors = array(); 
$output = array(); 

if(!empty($_FILES['image']['tmp_name'])){ 

    foreach($_FILES['image']['name'] as $key => $array_value){ 

     if(!in_array(pathinfo($_FILES['image']['name'][$key], PATHINFO_EXTENSION), $allowed_extension)){ 
       die("Die!"); 
     } 
    } 

    foreach($_FILES['image']['name'] as $key => $array_value){ 

     $file_name = $_FILES['image']['name'][$key]; 
     $file_size = $_FILES['image']['size'][$key]; 
     $file_tmp = $_FILES['image']['tmp_name'][$key]; 

     $file_extension = pathinfo($file_name, PATHINFO_EXTENSION); 
     $file_extension = strtolower($file_extension); 

     if (!in_array($file_extension, $allowed_extension)){ 
     $errors[$file_name][] = "format $file_extension in image $file_name is not accepted"; 
     continue; 
     } 

     if ($file_size > 2097152){ 
     $errors[$file_name][] = "maxsize of 2MB on $file_name has reached"; 
        } 

     if (count($errors) == 0){ 

     $dir = "a/b/c"; 

     if (is_dir($dir)){ 
      mkdir("a/b/c/tmp_images", 0755); 
     }else{ 
      mkdir("a/b/c", 0755); 
      mkdir("a/b/c/tmp_images", 0755); 
     } 

     $path = "a/b/c/tmp_images"; 
     $prifix = basename($file_name, "." . $file_extension); 

     //var_dump ($prifix); 

     $uploadfile = $path . "/" . $file_name; 

     $x = 0; 
     while (file_exists($uploadfile)){ 
       $x ++; 
       $uploadfile = "{$path}/{$prifix}-{$x}.{$file_extension}"; 
      } 

      if (move_uploaded_file($file_tmp, $uploadfile)){ 
       $file_name = basename($uploadfile); 
       $output [$file_name] = "OK"; 

      }else{ 

      $output[$file_name] = "Failure while Uploading!"; 
      $errors[$file_name][] = "Failure: Can't move uploaded pictures!"; 
      }//else... 
     }//if(count($errors))... 
    }//foreach($_FILES['image']['name']... 
}//if(!empty($_FILES['image']['tmp_name'])... 

das Problem ist, dass ein Teil:

if(!empty($_FILES['image']['tmp_name'])){ 

     foreach($_FILES['image']['name'] as $key => $array_value){ 

      if(!in_array(pathinfo($_FILES['image']['name'][$key], PATHINFO_EXTENSION), $allowed_extension)){ 
        die("Die!"); 
      } 
     } 

im Fall von zwei verschiedenen Arten von Dateitypen Hochladen wird es den Upload abzubrechen. Das ist mein erstes Problem. In einem solchen Fall muss ich den Upload abbrechen, da dies für eine Datei ist, die ich nach dem Senden des Formulars erstellen möchte. Der Benutzer hat also keine Möglichkeit, Änderungen vorzunehmen, nachdem er das Formular gepostet hat. Lassen Sie uns auf den zweiten Teil einen Blick:

foreach($_FILES['image']['name'] as $key => $array_value){ 

      $file_name = $_FILES['image']['name'][$key]; 
      $file_size = $_FILES['image']['size'][$key]; 
      $file_tmp = $_FILES['image']['tmp_name'][$key]; 

      $file_extension = pathinfo($file_name, PATHINFO_EXTENSION); 
      $file_extension = strtolower($file_extension); 

      if (!in_array($file_extension, $allowed_extension)){ 
      $errors[$file_name][] = "format $file_extension in image $file_name is not accepted"; 
      continue; 
      } 

      if ($file_size > 2097152){ 
      $errors[$file_name][] = "maxsize of 2MB on $file_name has reached"; 
         ...} 

hier sieht man, dass es, dass eine Fehlermeldung angezeigt werden sollte angegangen werden tatsächlich gesehen werden sollte. wenn ich den ersten foreach-part belasse, habe ich das problem, dass bei zwei verschiedenen dateien eine datei hochgeladen wird und bei der anderen die fehlermeldung angezeigt wird.

so sollte es eine Möglichkeit geben, die erste und die zweite foreach zu kombinieren. Wenn es jemanden gibt, der mir den richtigen Weg weist, würde ich es wirklich schätzen. Danke vielmals.

UPDATE

in Ordnung, sorry für mein Zuspätkommen. Hier mein Feedback: Dieser Code scheint bei zwei verschiedenen Dateitypen einige Probleme zu haben. es scheint wie

if (count($errors)>0){ 
    die ("...") 
} 

zählt nicht wirklich. bei, dass sie die Fehlermeldung erhalten:

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to access a/b/c/tmp_images/abc.xls 

aber es wird auch einen Upload für das Bild zu tun, das eine zulässige Erweiterung hat, aber dies kann nicht erfolgreich sein, wegen des falschen Dateitypen des anderen, Ich vermute. das Problem ist, dass dies die INSERT-Abfrage verursacht, die hier verwendet wird:

if (move_uploaded_file($fileTmp, $fileDst)) { 
      $output[$fileBase] = "OK"; 

      **$insert = $db->query("INSERT INTO table (a, b, c) VALUES('".$a."','".$b."','".$c."')");{ 

      mkdir("a/b/c/d/e", 0755); 
      rename("a/b/c/tmp_images", "a/b/c/d/e/tmp_images"); 

      $msg ="text abc.";       

      $to = "[email protected]"; 
      $subject = "xxx "; 
      $message = "text"; 

      $headers = "From: xxx<[email protected]>\r\n"; 
      $headers .= "Content-type: text/plain; charset=UTF-8\r\n"; 
      $mailheader .= "Return-Path: [email protected]" .$_SERVER['SERVER_NAME']. "\r\n"; 
      $mailheader .= "MIME-Version: 1.0\r\n"; 
      $mailheader .= "Content-Transfer-Encoding: 7bit\r\n"; 
      $mailheader .= "Message-ID: <" .time(). " [email protected]" .$_SERVER['SERVER_NAME']. ">\r\n"; 
      $mailheader .= "X-Mailer: PHP v" .phpversion(). "\r\n\r\n"; 

      mail($to, $subject, $message, $headers); 

      }//** 

      }else{ 

       $output[$fileBase] = "Fehler beim Upload des Bildmaterials!"; 
       $errors2[$fileBase][] = "Fehler: Die hochgeladenen Dateien können nicht verschoben werden!"; 
      }//    
     }// 

     if (count($errors) > 0) { 
      die("Failurecode: "); 
      echo "$errors"; 
    }... 

und ich würde die Fehlermeldungen aus dem 2-dimensionalen Array die gleiche Art und Weise wie ich sich von meinen anderen Fehlermeldungen nähern lernen bekommen, dass kommt von eindimensionalen Arrays auf der gleichen Seite wie das Formular sein wird. Im Falle von "Die" wird eine neue leere Seite geöffnet, um den Fehler anzuzeigen. Danke vielmals.

Antwort

1

Sie benötigen zwei Schleifen dafür, aber der Ansatz, den Sie gewählt haben, ist leicht fehlerhaft. Sie benötigen eine Validierungsschleife, die alle Validierungen für alle Dateien durchführt, und dann eine zweite Schleife, die die Dateien in den permanenten Speicher verschiebt.

So etwas wie diese (FIXED):

<?php 

    // Settings 
    $allowedExtensions = array('jpg', 'jpeg', 'png', 'bmp', 'tiff', 'gif'); 
    $maxSize = 2097152; 
    $storageDir = 'a/b/c/tmp_images'; 

    // Result arrays 
    $errors = $output = array(); 

    if (!empty($_FILES['image'])){ 

    // Validation loop (I prefer for loops for this specific task) 
    for ($i = 0; isset($_FILES['image']['name'][$i]); $i++) { 

     $fileName = $_FILES['image']['name'][$i]; 
     $fileSize = $_FILES['image']['size'][$i]; 
     $fileErr = $_FILES['image']['error'][$i]; 
     $fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); 

     // Validate extension 
     if (!in_array($fileExt, $allowedExtensions)) { 
     $errors[$fileName][] = "Format $fileExt in image $fileName is not accepted"; 
     } 

     // Validate size 
     if ($fileSize > $maxSize) { 
     $errors[$fileName][] = "$fileName excedes the maximum file size of $maxSize bytes"; 
     } 

     // Check errors 
     if ($fileErr) { 
     $errors[$fileName][] = "$fileName uploaded with error code $fileErr"; 
     } 

    } 

    // Handle validation errors here 
    if (count($errors) > 0) { 
     die("Errors validating uploads: ".print_r($errors, TRUE)); 
    } 

    // Create the storage directory if it doesn't exist 
    if (!is_dir($storageDir)) { 
     if (!mkdir($storageDir, 0755, TRUE)) { // Passing TRUE as the third argument creates recursively 
     die("Unable to create storage directory $storageDir"); 
     } 
    } 

    // File move loop 
    for ($i = 0; isset($_FILES['image']['name'][$i]); $i++) { 

     // Get base info 
     $fileBase = basename($_FILES['image']['name'][$i]); 
     $fileName = pathinfo($fileBase, PATHINFO_FILENAME); 
     $fileExt = pathinfo($fileBase, PATHINFO_EXTENSION); 
     $fileTmp = $_FILES['image']['tmp_name'][$i]; 

     // Construct destination path 
     $fileDst = $storageDir.'/'.basename($_FILES['image']['name'][$i]); 
     for ($j = 0; file_exists($fileDst); $j++) { 
     $fileDst = "$storageDir/$fileName-$j.$fileExt"; 
     } 

     // Move the file  
     if (move_uploaded_file($fileTmp, $fileDst)) { 
     $output[$fileBase] = "Stored $fileBase OK"; 
     } else { 
     $output[$fileBase] = "Failure while uploading $fileBase!"; 
     $errors[$fileBase][] = "Failure: Can't move uploaded file $fileBase!"; 
     } 

    } 

    // Handle file move errors here 
    if (count($errors) > 0) { 
     die("Errors moving uploaded files: ".print_r($errors, TRUE)); 
    } 

    } 
+1

das scheint der richtige Weg zu sein. Ich teste es immer noch aus. Da sind ein paar kleine Fehler drin. Ich werde später kommentieren. Für den Moment möchte ich Ihnen für Ihre Hilfe danken.Bitte beobachten Sie diese Frage. Ich werde heute Abend weitere Informationen und Feedback geben. – bonny

+0

in Ordnung, sorry für mein Zuspätkommen. hier mein Feedback: Dieser Code scheint Probleme bei zwei verschiedenen Dateitypen zu haben. es scheint, wie wenn (count ($ fehler)> 0) {die ("df ..."} – bonny

+0

die Ausgabe von 'print_r ($ fehler) zeigen bitte', wenn Sie einen Fehler erhalten – DaveRandom

0
if(!empty($_FILES['image']['tmp_name'])) 
{ 
    foreach($_FILES['image']['name'] as $key => $array_value) 
    { 
     $file_name = $_FILES['image']['name'][$key]; 
     $file_size = $_FILES['image']['size'][$key]; 
     $file_tmp = $_FILES['image']['tmp_name'][$key]; 

     $file_extension = pathinfo($file_name, PATHINFO_EXTENSION); 
     $file_extension = strtolower($file_extension);   

     if($file_size > 2097152) 
     { 
      $errors[$file_name][] = "maxsize of 2MB on $file_name has reached"; 
     }   
     if(!in_array($file_extension, $allowed_extension) 
     { 
      $errors[$file_name][] = "format $file_extension in image $file_name is not accepted"; 
     } 
    } 
} 
+0

Sie links einfach den Hauptinhalt dieses Skripts. Dies ist definitiv nicht der richtige Weg, um das Problem zu lösen. Es tut uns leid. – bonny

1

dies versuchen,

$filename = $_FILES["quoteexcel"]["name"]; 
//here $filename is an array of file names to be uploaded 
$tmpvalues = $_FILES["quoteexcel"]["tmp_name"]; 
//here $tmpvalues is an array of temporary file names 

$j=0; 
foreach($filename as $key => $value) 
{ 
$ext = pathinfo($value, PATHINFO_EXTENSION);  
if($ext=='jpg' || $ext=='jpeg' || $ext=='png' || $ext=='tiff' || $ext=='gif') 
$j = $j; 
else  $j++;           
} 

if($j==0) 
{ 
foreach($filename as $key => $value) 
    { 
    //do the upload process here; 
    } 
} 
else 
{ 
    echo "file format not supported"; 
}