2009-06-03 6 views
37

Ich mache eine Formularvalidierung, um sicherzustellen, dass die Datei, die ein Benutzer hochgeladen hat, den richtigen Typ hat. Aber der Upload ist optional, daher möchte ich die Validierung überspringen, wenn er nichts hochgeladen und den Rest des Formulars eingereicht hat. Wie kann ich überprüfen, ob er etwas hochgeladen hat oder nicht? Wird $_FILES['myflie']['size'] <=0 funktionieren?Wie überprüft man, ob der Benutzer eine Datei in PHP hochgeladen hat?

Antwort

101

können Sie is_uploaded_file() verwenden:

if(!file_exists($_FILES['myfile']['tmp_name']) || !is_uploaded_file($_FILES['myfile']['tmp_name'])) { 
    echo 'No upload'; 
} 

Aus der Dokumentation:

Gibt TRUE zurück, wenn die durch Dateinamen angegebene Datei über HTTP POST hochgeladen wurde. Dies ist nützlich, um sicherzustellen, dass ein böswilliger Benutzer hat nicht versucht, das Skript in die Bearbeitung von Dateien auf , die es nicht funktionieren sollte - für Instanz,/etc/passwd.

Diese Art der Überprüfung ist besonders wichtig, wenn es irgendeine Chance, dass alles mit hochgeladenen Dateien getan ihren Inhalt in die Benutzer zugänglich machen könnte oder sogar an anderen Benutzern auf dem gleiche System.

EDIT: Ich bin diese Klasse in meinem Fileupload verwenden, falls es hilft:

public function fileUploaded() 
{ 
    if(empty($_FILES)) { 
     return false;  
    } 
    $this->file = $_FILES[$this->formField]; 
    if(!file_exists($this->file['tmp_name']) || !is_uploaded_file($this->file['tmp_name'])){ 
     $this->errors['FileNotExists'] = true; 
     return false; 
    } 
    return true; 
} 
+0

Ayman, Sie müssen ihm den 'tmp_name' geben. Aus dem doc: Für richtiges Arbeiten benötigt die Funktion is_uploaded_file() ein Argument wie $ _FILES ['userfile'] ['tmp_name'] – karim79

+0

@ Click Upvote - Hinzugefügt das file_exists() Bit an den Anfang, den ich eigentlich benutze dass ich weiß, dass es funktioniert. Probieren Sie es aus. – karim79

+0

Mein Fehler - das Array $ _FILES sollte, wie Greg B darauf hingewiesen hat, mit leer sein() – karim79

10

@ karim79 die richtige Antwort hat, aber ich hatte, seinem Beispiel zu umschreiben meine Zwecke. Sein Beispiel geht davon aus, dass der Name des übermittelten Feldes bekannt ist und fest codiert werden kann. Ich ging einen Schritt weiter und machte eine Funktion, die mir sagt, ob irgendwelche Dateien hochgeladen wurden, ohne den Namen des Upload-Feldes zu kennen.

/** 
* Tests all upload fields to determine whether any files were submitted. 
* 
* @return boolean 
*/ 
function files_uploaded() { 

    // bail if there were no upload forms 
    if(empty($_FILES)) 
     return false; 

    // check for uploaded files 
    $files = $_FILES['files']['tmp_name']; 
    foreach($files as $field_title => $temp_name){ 
     if(!empty($temp_name) && is_uploaded_file($temp_name)){ 
      // found one! 
      return true; 
     } 
    } 
    // return false if no files were found 
    return false; 
} 
+0

jedes Mal zurückgeben false mir das if (leer ($ _ FILES)) .... – Phoenix

8

Dieser Code funktionierte für mich. Ich verwende mehrere Datei-Uploads, also musste ich prüfen, ob ein Upload stattgefunden hat.

HTML-Teil:

<input name="files[]" type="file" multiple="multiple" /> 

PHP Teil:

if(isset($_FILES['files'])){ 


foreach($_FILES['files']['tmp_name'] as $key => $tmp_name){ 

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

    // things you want to do 
    } 
} 
3

ich Ihren Code überprüft und denken Sie dies versuchen sollte:

if(!file_exists($_FILES['fileupload']['tmp_name']) || !is_uploaded_file($_FILES['fileupload']['tmp_name'])) 
    { 
     echo 'No upload'; 
    } 
    else 
     echo 'upload'; 
1

is_uploaded_file() groß zu verwenden, die speziell für Überprüfen, ob es sich um eine hochgeladene Datei oder eine lokale Datei handelt (aus Sicherheitsgründen). Wenn Sie überprüfen möchten, ob der Benutzer eine Datei hochgeladen hat, verwenden Sie $_FILES['file']['error'] == UPLOAD_ERR_OK.

Siehe das PHP-Handbuch unter file upload error messages. Wenn Sie nur nach einer Datei suchen möchten, verwenden Sie UPLOAD_ERR_NO_FILE.

2
<!DOCTYPE html> 
<html> 
<body> 

<form action="#" method="post" enctype="multipart/form-data"> 
    Select image to upload: 
    <input name="my_files[]" type="file" multiple="multiple" /> 
    <input type="submit" value="Upload Image" name="submit"> 
</form> 


<?php 

if (isset($_FILES['my_files'])) 
    { 
    $myFile = $_FILES['my_files']; 
    $fileCount = count($myFile["name"]); 


     for ($i = 0; $i <$fileCount; $i++) 
     { 
      $error = $myFile["error"][$i]; 

      if ($error == '4') // error 4 is for "no file selected" 
      { 
       echo "no file selected"; 
      } 
      else 
      { 

       $name = $myFile["name"][$i]; 
       echo $name; 
       echo "<br>"; 
       $temporary_file = $myFile["tmp_name"][$i]; 
       echo $temporary_file; 
       echo "<br>"; 
       $type = $myFile["type"][$i]; 
       echo $type; 
       echo "<br>"; 
       $size = $myFile["size"][$i]; 
       echo $size; 
       echo "<br>"; 



       $target_path = "uploads/$name"; //first make a folder named "uploads" where you will upload files 


       if(move_uploaded_file($temporary_file,$target_path)) 
        { 
        echo " uploaded"; 
        echo "<br>"; 
        echo "<br>"; 
        } 
        else 
        { 
        echo "no upload "; 
        } 




       } 
     } 
} 
     ?> 


</body> 
</html> 

siehe http://www.techzigzag.com/how-to-check-that-user-has-upload-any-file-or-not-in-php/

aber wachsam sein. Der Benutzer kann jede Art von Datei hochladen und kann auch Ihren Server oder Ihr System hacken, indem Sie eine schädliche oder PHP-Datei hochladen.In diesem Skript sollte es einige Validierungen geben. Vielen Dank.

1

Sie sollten $_FILES[$form_name]['error'] verwenden. Es wird UPLOAD_ERR_NO_FILE zurückgegeben, wenn keine Datei hochgeladen wurde. Vollständige Liste: PHP: Error Messages Explained

function isUploadOkay($form_name, &$error_message) { 
    if (!isset($_FILES[$form_name])) { 
     $error_message = "No file upload with name '$form_name' in form."; 
     return false; 
    } 
    $error = $_FILES[$form_name]['error']; 

    // List at: http://php.net/manual/en/features.file-upload.errors.php 
    if ($error != UPLOAD_ERR_OK) { 
     switch ($error) { 
      case UPLOAD_ERR_INI_SIZE: 
       $error_message = 'The uploaded file exceeds the upload_max_filesize directive in php.ini.'; 
       break; 

      case UPLOAD_ERR_FORM_SIZE: 
       $error_message = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.'; 
       break; 

      case UPLOAD_ERR_PARTIAL: 
       $error_message = 'The uploaded file was only partially uploaded.'; 
       break; 

      case UPLOAD_ERR_NO_FILE: 
       $error_message = 'No file was uploaded.'; 
       break; 

      case UPLOAD_ERR_NO_TMP_DIR: 
       $error_message = 'Missing a temporary folder.'; 
       break; 

      case UPLOAD_ERR_CANT_WRITE: 
       $error_message = 'Failed to write file to disk.'; 
       break; 

      case UPLOAD_ERR_EXTENSION: 
       $error_message = 'A PHP extension interrupted the upload.'; 
       break; 

      default: 
       $error_message = 'Unknown error'; 
      break; 
     } 
     return false; 
    } 

    $error_message = null; 
    return true; 
} 
Verwandte Themen