2009-06-03 26 views
37

Eseguo una convalida del modulo per garantire che il file caricato da un utente sia del tipo giusto. Ma il caricamento è facoltativo, quindi voglio saltare la convalida se non ha caricato nulla e inviato il resto del modulo. Come posso verificare se ha caricato qualcosa o no? $_FILES['myflie']['size'] <=0 funzionerà?Come verificare se l'utente ha caricato un file in PHP?

risposta

101

È possibile utilizzare is_uploaded_file():

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

Dalla documentazione:

restituisce true se il file indicato da nome del file è stato caricato via HTTP POST. Ciò è utile per garantire che un utente malintenzionato non abbia tentato di ingannare lo script su file che non dovrebbe funzionare, per l'istanza ,/etc/passwd.

Questo tipo di controllo è particolarmente importante se c'è qualche possibilità che nulla di fatto con i file caricati potrebbe rivelare il loro contenuto per l'utente , o anche ad altri utenti sul stesso sistema.

EDIT: Sto usando questo nella mia classe FileUpload, nel caso in cui aiuta:

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, è necessario dargli il 'tmp_name'. Dal doc: Per il corretto funzionamento, la funzione is_uploaded_file() richiede un argomento come $ _FILES ['userfile'] ['tmp_name'] – karim79

+0

@ Click Upvote - Aggiunto il bit file_exists() all'inizio, sto effettivamente usando così, so che funziona. Provaci. – karim79

+0

Il mio male - l'array $ _FILES, come ha sottolineato Greg B, deve essere controllato con vuoto() – karim79

10

@ karim79 ha la risposta giusta, ma ho dovuto riscrivere il suo esempio per soddisfare i miei scopi. Il suo esempio presuppone che il nome del campo inviato sia noto e possa essere codificato. Ho fatto un ulteriore passo avanti e ho creato una funzione che mi dirà se alcuni file sono stati caricati senza conoscere il nome del campo di caricamento.

/** 
* 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

ogni volta restituire false me se questo (vuoto ($ _ FILES)) .... – Phoenix

8

Questo codice ha funzionato per me. Sto usando più caricamenti di file, quindi ho dovuto verificare se ci sono stati dei caricamenti. parte

HTML:

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

PHP parte:

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

Ho controllato il codice e che si dovrebbe provare questo:

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

is_uploaded_file() è ottimo da utilizzare, specialmente per controllando se si tratta di un file caricato o di un file locale (per motivi di sicurezza).

Tuttavia, se si desidera verificare se l'utente ha caricato un file, utilizzare $_FILES['file']['error'] == UPLOAD_ERR_OK.

Vedere il manuale PHP su file upload error messages. Se si desidera verificare la mancanza di file, utilizzare 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> 

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

Ma stare all'erta. L'utente può caricare qualsiasi tipo di file e può anche hackerare il tuo server o sistema caricando un file dannoso o php.In questo script dovrebbero esserci alcune validazioni. Grazie.

1

È necessario utilizzare $_FILES[$form_name]['error']. Restituisce UPLOAD_ERR_NO_FILE se nessun file è stato caricato. Lista completa: 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; 
} 
Problemi correlati