web-dev-qa-db-fra.com

Comment tester si un utilisateur a SÉLECTIONNÉ un fichier à télécharger?

sur une page, j'ai:

if (!empty($_FILES['logo']['name'])) {
    $dossier     = 'upload/';
    $fichier     = basename($_FILES['logo']['name']);
    $taille_maxi = 100000;
    $taille      = filesize($_FILES['logo']['tmp_name']);
    $extensions  = array('.png', '.jpg', '.jpeg');
    $extension   = strrchr($_FILES['logo']['name'], '.');

    if(!in_array($extension, $extensions)) {
        $erreur = 'ERROR you  must upload the right type';
    }

    if($taille>$taille_maxi) {
         $erreur = 'too heavy';
    }

    if(!empty($erreur)) {
      // ...
    }
}

Le problème est que si les utilisateurs veulent éditer des informations SANS télécharger un LOGO, cela soulève une erreur: 'erreur, vous devez télécharger le bon type'

Donc, si un utilisateur n'a rien mis dans la boîte de saisie pour le télécharger, je ne veux pas entrer dans ces conditions.

j'ai testé: if (!empty($_FILES['logo']['name']) et if (isset($_FILES['logo']['name'])

mais les deux ne semblent pas fonctionner.

Des idées?

edit: peut-être que je n'étais pas si clair, je ne veux pas tester s'il a téléchargé un logo, je veux tester SI il a sélectionné un fichier à télécharger, parce que maintenant, s'il ne sélectionne pas un fichier à télécharger, php soulève une erreur indiquant qu'il doit télécharger avec le bon format.

merci.

44
sf_tristanb

Vous pouvez vérifier cela avec:

if (empty($_FILES['logo']['name'])) {
    // No file was selected for upload, your (re)action goes here
}

Ou vous pouvez utiliser une construction javascript qui active uniquement le bouton de téléchargement/soumission chaque fois que le champ de téléchargement a une valeur autre qu'une chaîne vide ("") pour éviter la soumission du formulaire sans aucun téléchargement.

78
Oldskool

Il y a une section dans la documentation php sur gestion des fichiers . Vous allez trouver que vous pouvez vérifier diverses erreurs et l'une d'elles est

UPLOAD_ERR_OK
    Value: 0; There is no error, the file uploaded with success.
<...>
UPLOAD_ERR_NO_FILE
    Value: 4; No file was uploaded.

Dans votre cas, vous avez besoin d'un code comme

if ($_FILES['logo']['error'] == UPLOAD_ERR_OK) { ... }

ou

if ($_FILES['logo']['error'] != UPLOAD_ERR_NO_FILE) { ... }

Vous devriez également envisager de vérifier (et probablement de fournir une réponse appropriée à un utilisateur) d'autres erreurs diverses.

34
Jonas

Vous devez utiliser is_uploaded_file ($ _ FILES ['logo'] ['tmp_name']) pour vous assurer que le fichier a bien été téléchargé via un POST.

14
baloo

Je testerais if (file_exists($_FILES['logo']['tmp_name'])) et verrais si cela fonctionne.

Ou, de façon plus appropriée (merci Baloo): if (is_uploaded_file($_FILES['logo']['tmp_name']))

7
Jess