Se connecter / S'enregistrer
Votre question

php : interdire upload d'une image avec même nom

Tags :
  • Upload
  • Programmation
Dernière réponse : dans Programmation
16 Janvier 2007 17:42:18

bonjour à tous,

je tente désespérément d'empêcher un upload d'une image qui aurait le même nom qu'une autre déjà présente dans le dossier "photos" (du coup, logo.jpg est remplacé par une image qui a le même nom et que j'ai chargé ultérieurement).

ET je ne vois pas comment faire malgré les tuto !!!
Je me doute que c'est une condition mais laquelle et où ?

voici mon code php :

Citation :
<?php
$dossier = 'photos/';
$fichier = basename($_FILES['mon_image']['name']);
$taille_maxi = 1000000000;
$taille = filesize($_FILES['mon_image']['tmp_name']);
$extensions = array('.png', '.gif', '.jpg', '.jpeg');
$extension = strrchr($_FILES['mon_image']['name'], '.');

$connexion=mysql_connect ('localhost','root','') or die ("impossible de se connecter à la base de données");
mysql_select_db ('phototheque');

if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
$erreur = "Vous devez charger un fichier de type png, gif, jpg, jpeg";
}
if($taille>$taille_maxi)
{
$erreur = "le fichier est trop gros...";
}
if(!isset($erreur))
{
$fichier = strtr($fichier,
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
if(move_uploaded_file($_FILES['mon_image']['tmp_name'], $dossier . $fichier))
{
echo "succès !";
}
else
{
echo "échec du chargement !";
}
}
else
{
echo $erreur;
}

mysql_close($connexion);

?>


si quelqu'un a une idée voire un superbe lien que j'ai pas encore trouvé...
merci d'avance

Autres pages sur : php interdire upload image nom

16 Janvier 2007 17:48:41

un simple:
  1. if (!file_exists ($dossier . $fichier))
  2. {
  3. if (move_uploaded_file...
  4. ...
  5. }
  6. else
  7. {
  8. echo "fichier existe déjà\n";
  9. }

16 Janvier 2007 18:00:46

parfait parfait,, j'ai mis :

Citation :
if (!file_exists ($dossier . $fichier))
{
$erreur = "
déjà là
";
}


meri bien

Contenus similaires
16 Janvier 2007 19:13:20

ça marche pas en fait car tout les upload sont dégagés !!!
aucun ne passe à cause de la nouvelle condition.
pourtant mon code paraît bon :

Citation :

<?php
$dossier = 'photos/';
$fichier = basename($_FILES['mon_image']['name']);
$taille_maxi = 1000000000;
$taille = filesize($_FILES['mon_image']['tmp_name']);
$extensions = array('.png', '.gif', '.jpg', '.jpeg');
$extension = strrchr($_FILES['mon_image']['name'], '.');

$connexion=mysql_connect ('localhost','root','') or die ("impossible de se connecter à la base de données");
mysql_select_db ('phototheque');

if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
$erreur = "Vous devez charger un fichier de type png, gif, jpg, jpeg";
}
if($taille>$taille_maxi)
{
$erreur = "le fichier est trop gros...";
}
if (!file_exists ($dossier . $fichier))
{
$erreur = "déjà là";
}
if(!isset($erreur))
{
$fichier = strtr($fichier,
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
if(move_uploaded_file($_FILES['mon_image']['tmp_name'], $dossier . $fichier))
{
echo "succès !";
}
else
{
echo "échec du chargement !";
}
}
else
{
echo $erreur;
}

mysql_close($connexion);

?>


j'vois vraiment pas là...
faute de syntaxe? petit oubli? :heink: 

merci pour votre aide
Anonyme
16 Janvier 2007 19:26:27

Je connais pas le php, je risque de dire une bétise, mais ça serait pas plutôt :
if (file_exists ($dossier . $fichier))
{
$erreur = "déjà là";
}
16 Janvier 2007 19:32:49

non apparemment.. il accepte tout maintenant et refuse toujours pas une photo qui a le même nom... retour au point de départ

au secours !!!
Anonyme
16 Janvier 2007 19:33:58

avant le if, fais afficher le dossier et le nom du fichier pour voir
16 Janvier 2007 19:36:42

comment ça?

je crois que c'est déjà fait tout en haut avec :

$dossier = 'photos/';
$fichier = basename($_FILES['mon_image']['name']);

non ?
je piges pas bien sinon
Anonyme
16 Janvier 2007 19:38:26

Oui, trouve un moyen de les afficher sur ta page, pour vérifier qu'il sont bien corrects
16 Janvier 2007 19:40:42

en fait, ils doivent être corrects car, sans la condition qui me gêne, tout fonctionne bien : je charge, je redirectionne, etc.

ça doit venir d'autre part...
16 Janvier 2007 20:02:03

camzo a dit :
parfait parfait,, j'ai mis :

Citation :
if (!file_exists ($dossier . $fichier))
{
$erreur = "
déjà là
";
}


meri bien


tu as pas bien compris mon post, tu remarqueras que j'ai mis un ! avant le file_exists () ce qui veut dire n'existe pas
et c'est dans le else que j'affiche l'erreur

de plus dans ton programme, tu compares $fichier avant de le formater, il ne le trouvera donc pas dans le repertoire s'il contient un accent ou tout ce que tu enleves avant de le sauver


EDIT: d'ailleurs je ne comprends pas bien, pourquoi tu n'as pas simplement repris le squelette que j'ai mis au lieu de mettre un nieme variable ($erreur) que tu retestes dans le if avant le move_...?
16 Janvier 2007 20:14:31

pour le ! j'ai juste testé. et comme tu le dis, faut le laisser. Pour la suite, j'ai pas tout pigé (désolé, j'suis pas ben fort...). Mis, j'ai esaayé quand même et :

  1. if(!isset($erreur))
  2. if (!file_exists ($dossier . $fichier))
  3. {
  4. $fichier = strtr($fichier,
  5. 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
  6. 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
  7. $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
  8. if(move_uploaded_file($_FILES['mon_image']['tmp_name'], $dossier . $fichier))
  9. {
  10. echo "succès !";
  11. }
  12. else
  13. {
  14. echo "fichier existe déjà\n";
  15. }


c'est plus ça...?
merci de me donner ton avis
16 Janvier 2007 20:25:39

je viens de relire ton code, j'ai pas remarqué que tu utilisais $erreur autre part :) 
essaye ca:
  1. $fichier = strtr($fichier,
  2. 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
  3. 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
  4. $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
  5. // a ce stade $fichier devrait exactement correspondre au nom sur le disque
  6. if (file_exists ($dossier . $fichier))
  7. {
  8. $erreur = "le fichier existe déjà";
  9. }
  10. if(!isset($erreur))
  11. {
  12. if(move_uploaded_file($_FILES['mon_image']['tmp_name'], $dossier . $fichier))
  13. {
  14. echo "succès !";
  15. }
  16. else
  17. {
  18. echo "ehec du chargement\n";
  19. }
  20. }
  21. else
  22. echo $erreur;


et il faudrait ne pas tester le reste des conditions une fois qu'une erreur est détécté, c'est une perte de temps
16 Janvier 2007 20:39:29

ok ok... ça marche. et je crois comprendre maintenant quand tu disais qu'il fallait formater avant... effectivement, le strtr(fichier, était mal placé, etc.

bref, mes variables étaient mal placées (trop loin en fait). Mais j'avoue que j'aurais pas pensé à mettre le !isset...

merci en tout cas car ça m'éclairci (et m'aide) grandement !!!
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS