web-dev-qa-db-fra.com

Comment vérifier si l'utilisateur a téléchargé un fichier en PHP?

Je fais une validation de formulaire pour m'assurer que le fichier téléchargé par un utilisateur est du bon type. Mais le téléchargement est facultatif, donc je veux ignorer la validation s'il n'a rien téléchargé et a soumis le reste du formulaire. Comment puis-je vérifier s'il a téléchargé quelque chose ou non? Volonté $_FILES['myflie']['size'] <=0 travail?

49
Click Upvote

Vous pouvez utiliser is_uploaded_file() :

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

De la documentation:

Renvoie VRAI si le fichier nommé par nom de fichier a été téléchargé via HTTP POST. Ceci est utile pour vous assurer qu'un utilisateur malveillant n'a pas essayé de tromper le script pour qu'il travaille sur des fichiers sur lesquels il ne devrait pas fonctionner - par exemple,/etc/passwd.

Ce type de vérification est particulièrement important s'il y a une chance que tout ce qui est fait avec des fichiers téléchargés puisse révéler leur contenu à l'utilisateur, ou même à d'autres utilisateurs sur le même système.

EDIT: J'utilise ceci dans ma classe FileUpload, au cas où cela aiderait:

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;
}
124
karim79

Ce code a fonctionné pour moi. J'utilise plusieurs téléchargements de fichiers, je devais donc vérifier s'il y avait eu un téléchargement.

Partie HTML:

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

Partie PHP:

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
    }
}
10
pranjal

@ karim79 a la bonne réponse, mais j'ai dû réécrire son exemple en fonction de mes objectifs. Son exemple suppose que le nom du champ soumis est connu et peut être codé en dur. J'ai pris un peu plus loin et créé une fonction qui me dira si des fichiers ont été téléchargés sans avoir à connaître le nom du champ de téléchargement.

/**
 * 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;
}
9
doub1ejack
<!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>

Mais soyez vigilant. L'utilisateur peut télécharger n'importe quel type de fichier et peut également pirater votre serveur ou votre système en téléchargeant un fichier malveillant ou php. Dans ce script, il devrait y avoir des validations. Merci.

3
shiv

J'ai vérifié votre code et je pense que vous devriez essayer ceci:

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

Tu devrais utiliser $_FILES[$form_name]['error']. Il renvoie UPLOAD_ERR_NO_FILE si aucun fichier n'a été téléchargé. Liste complète: PHP: Explication des messages d'erreur

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;
}
2
Simon Backx

is_uploaded_file() est génial à utiliser, spécialement pour vérifier s'il s'agit d'un fichier téléchargé ou d'un fichier local (pour des raisons de sécurité).

Cependant, si vous souhaitez vérifier si l'utilisateur a téléchargé un fichier, utilisez $_FILES['file']['error'] == UPLOAD_ERR_OK.

Voir le manuel PHP on messages d'erreur de téléchargement de fichier . Si vous voulez simplement vérifier l'absence de fichier, utilisez UPLOAD_ERR_NO_FILE.

1
TD_Nijboer