Upload d'image en php

Petit nouveau ! | 3 Messages

11 juin 2008, 21:21

Bonjour bonjour !

Alors voilà, je travaille en ce moment sur un formulaire php avec base de données MySQL. L'internaute peut envoyer ses données et uploader 3 photos sur le serveur s'il le souhaite (tout en envoyant l'url de l'image dans la base de données). Je suis arrivée à faire tout ça, mais là où ça bug, c'est si l'internaute choisi de ne pas envoyer d'image (laissant donc le champ vide).

Voilà le script utilisé pour traiter l'upload :
if(isset($_FILES['tof1'])) {
  // params
  $rand = rand (1000, 9999);
  unset($erreur);  
  $extensions_ok = array('png', 'gif', 'jpg', 'jpeg');
  $taille_max = 500000;
  $dest_dossier = 'gall/';
  // vérifications
  if( !in_array( substr(strrchr($_FILES['tof1']['name'], '.'), 1), $extensions_ok ) )
  {
    $erreur = 'Photo 1 : Veuillez sélectionner un fichier de type png, gif ou jpg !';  
  }
  elseif( file_exists($_FILES['tof1']['tmp_name']) 
          and filesize($_FILES['tof1']['tmp_name']) > $taille_max)
  {
    $erreur = 'Photo 1 : Votre fichier doit faire moins de 500Ko !';
  }
  // copie du fichier
  if(!isset($erreur))
  {
    $dest_fichier = basename($_FILES['tof1']['name']);
    // formatage nom fichier
    // enlever les accents
    $dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    // remplacer les caracteres autres que lettres, chiffres et point par _
    $dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
    // copie du fichier
    move_uploaded_file($_FILES['tof1']['tmp_name'], $dest_dossier . $rand . $dest_fichier);
	$photo1= $rand.$dest_fichier; 
  }
}
Dans le formulaire le champs concerné est :

Code : Tout sélectionner

<b>Photo 1 :</b> <input type="file" name="tof1" id="tof1" size="45" />
Et si je laisse ce champs vide, j'arrive au premier message d'erreur qui est "Photo 1 : Veuillez sélectionner un fichier de type png, gif ou jpg !". J'ai essayé plusieurs codes, comme entourer tout ce script avec :
if (empty($_POST['tof1'])) {echo ("pas de photo 1");}
else {
[i]le code ci-dessus[/i]
}
Voilà, je précise que je débute vraiment en php (je sais que je m'attaque à du lourd). J'avance à coup de "tests", en utilisant des scripts trouvés par-ci par-là. Mais ce que je voudrais ne doit pas être si compliqué à faire si ? Cela fait des heures que je tourne en rond avec ça. Et ce que je trouve sur internet ne s'applique pas à mon code. Peut-être qu'il existe une solution évidente à vos yeux mais que je n'arrive pas à trouver à force d'y réfléchir. Donc si vous avez quelque chose à me proposez, n'hésitez pas. Merci beaucoup !
Modifié en dernier par sylver le 11 juin 2008, 23:40, modifié 1 fois.

ViPHP
ViPHP | 4674 Messages

11 juin 2008, 23:22

Hey :),

Si tu envoies un formulaire qui contient un champ de type fichier, le tableau $_FILES existera forcément, excepté … qu'il sera vide. Il faut donc utiliser empty et pas isset :
if(empty($_FILES['tof1'])) {

    // …
}
Normalement, c'est ça :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 3 Messages

11 juin 2008, 23:39

Alors tout d'abord, merci. Je viens d'essayer ce que tu me dis et le formulaire se valide bien, sans aucun message d'erreur... mais aucune image n'a réellement été uploadée et aucune donnée n'a été envoyé dans la base :s

Mais heureusement, je n'ai pas lâché l'affaire en me disant que quelqu'un trouverait bien la solution pour moi. J'ai donc continué à chercher et à tester pendant tout ce temps et je crois que j'ai enfin trouvé ! Je comprends pas comment, mais ça fonctionne ! Je vous dis ce que j'ai fait, ça servira peut-être à quelqu'un d'autre :

Donc c'est toujours avec le code que j'ai mis en premier, et il faut juste ajouter cette ligne avant :
if($_FILES['tof1']['name']) {
// script ici, sans oublier de refermer l'accolade :p
}
Par contre je déconseille quand même de réutiliser mon code, parce que je crois que j'ai bidouillé un tas de choses (avec le "rand" notamment), le script original est facilement trouvable sur internet ;) (je pense que je l'ai trouvé sur php.net)

ViPHP
ViPHP | 4674 Messages

11 juin 2008, 23:51

Euh, j'ai été mauvais sur le coup. C'est si le tableau n'est pas vide qu'on effectue le script :
if(!empty($_FILES['tof1'])) {

    // ça ira mieux.
}
et pas de bidouille à ce niveau là au moins :).

Désolé :oops:.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 3 Messages

12 juin 2008, 00:12

Ok, j'avais déjà testé ça aussi en fait (j'ai fait tellement de tests, je m'embrouille moi-même). Et ça m'affiche quand même le message d'erreur "Photo 1 : Veuillez sélectionner un fichier de type png, gif ou jpg !". Encore une fois je ne sais pas pourquoi, mais j'ai abandonné l'idée même qu'il y ait une logique dans tout ça :s Merci quand même :)

ViPHP
AB
ViPHP | 5818 Messages

12 juin 2008, 03:04

Euh, j'ai été mauvais sur le coup. C'est si le tableau n'est pas vide qu'on effectue le script :
if(!empty($_FILES['tof1'])) {

    // ça ira mieux.
}
et pas de bidouille à ce niveau là au moins :).

Désolé :oops:.
Ben si petite bidouille quand même :lol:
Parce qu'après l'envoi du formulaire le tableau $_FILES['tof1'] ne sera jamais vide :wink: même si aucun fichier n'a été sélectionné.

Pour faire la différence entre un champ renseigné ou non il faudrait faire
if(!empty($_FILES['tof1']['name'])){

    // ça ira bien.
}

ViPHP
ViPHP | 4674 Messages

12 juin 2008, 09:14

Fatigué moi hier soir :P.
Merci AB de m'avoir repris.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).