Upload Form Feld darf leer bleiben?

sugar

Erfahrenes Mitglied
Hallo,

ich habe eine einfache Form mit zwei Feldern

HTML:
<form method="post" action="senden.php" enctype="multipart/form-data" name="form1">
<input type="file" name="file1"><br /><input type="file" name="file2">
....

Hier will ich in der senden.php abfragen ob die Upload Files (die als Attachment versendet werden sollen) auch die richtige Größe und richtiges Format haben. Das mache ich so:

PHP:
foreach($_FILES as $userfile1){

$tmp_name1 = $userfile1['tmp_name'];
$type1 = $userfile1['type'];
$name1 = $userfile1['name'];
$size1 = $userfile1['size'];
}

function  file_valid($type) 
                { 
                    $file_types  = array(   
                    'application/pdf'     => 'pdf', 
                    'application/msword'     => 'doc', 
                    'application/zip'     => 'zip', 
                    'application/x-zip-compressed'     => 'zip', 
        
                    ); 
                    
                    if(!array_key_exists($type, $file_types)) 
                    { 
                        return "FALSE"; 
                    } 
                    else 
                    { 
                        return "TRUE"; 
                    } 
                }  

if (file_valid($type1) === "FALSE") 
       { 
       $hack = true; 
	   $feld = "Falsches Datei Format";
}

Funktioniert auch soweit nur geht es nur wenn ich BEIDE Felder ausfülle. Aber es soll ja auch möglich sein nur ein Uplaod auszufüllen! Was mache ich falsch?

Wenn ich es einzeln abfrage z.B. so:

PHP:
if (file_valid($_FILES["file1"]["type"]) === "FALSE") 
       { 
       $hack = true; 
	   $feld = "Falsches Datei Format";
}

Ging es leider auch nicht! :(
 
item: Dein Code macht irgendwie keinen Sinn.
Am Anfang überschreibst du in einer Schleife deine variablen andauernd ohne sie aszuwerten. Nach der Schleife hast du nur die Werte vom letzten File drin.
Du solltest in der Schleife prüfen, nicht nach der Schleife.

item: die Funktion ist zu umständlich. Ich habe sie mal ein wenig gekürzt
PHP:
function  file_valid($type){ 
    $file_types  = array(   
    'application/pdf'     => 'pdf', 
    'application/msword'     => 'doc', 
    'application/zip'     => 'zip', 
    'application/x-zip-compressed'     => 'zip'); 
    
    return array_key_exists($type, $file_types); 
}  


foreach($_FILES as $key => $userfile){
    /** durch extract() ersetzt
    $tmp_name = $userfile['tmp_name'];
    $type = $userfile['type'];
    $name = $userfile['name'];
    $size = $userfile['size'];
    */
    
    // die Variablen erstellen (nicht nötig, man kann auch später direkt auf den array zugreifen)
    extract($userfile, EXTR_OVERWRITE);
    
    // prüfen ob der Name erfasst ist
    if (isset($name) && !is_null($name)){
        // prüfen ob der Dateitype erlaubt ist
        if (!file_valid($type)){
           $hack = true; 
           $feld = "Falsches Datei Format bei Date #{$key}";
        }
    }
}
 
Das ist natürlich wesentlich besser so. Vielen Dank!

Aber ein Feld leer lassen kann ich beim Upload leider immer noch nicht. Zwar zeigt er mir jetzt an welches Feld, dank deiner Hilfe, aber es darf nicht leer sein! Dann bekomme ich die Meldung falsches Dateiformat.
 
Vielen Dank für den Tipp! Mensch hätte ich das gleich mal gefunden! Habe folgendes Script entdeckt was natürlich viel besser ist und sich auch nicht auf die MIME Types verlässt.

PHP:
 $allowedExtensions = array("doc","pdf","zip","docx"); 
  foreach ($_FILES as $file) { 
    if ($file['tmp_name'] > '') { 
      if (!in_array(end(explode(".", 
            strtolower($file['name']))), 
            $allowedExtensions)) { 
	$hack = true; 
	$feld = "Falsches Dateiformat";
      } 
    } 
  }

Funktioniert super.

Danke!
 
Für Size scheint es zu funktionieren. Nur möchte der Kunde gern die Gesamtgröße aller Anhänge auf 7 MB beschränken? Geht das auch?

so ist es jetzt:

PHP:
foreach ($_FILES as $file) { 
    if ($file['size'] > '7340032') { 
     
	$hack = true; 
	$feld = "Bitte maximal 7MB versenden";
    } 
  }

Danke noch mal für eure Hilfe!
 
Zuletzt bearbeitet:
Zurück