[Résolu] [PHP] renommer un fichier si il existe déja
Dernière réponse : dans Programmation
Hello, je viens de faire un uploader d'images, disponible a cetet adresse.
Mais j'aimerais mettre en place un code qui renomme l'image si celle ci existe déja dans le répértoire d'upload. Exemple, si j'uplaode salut.png et que je le réuploade une deuxieme fois, j'aurais salut154.png.
Pour cela j'ai mis en place ceci :
$filename = '/upload/$nom_fichier';
$rand = 'rand(5, 50)';
if (file_exists($filename)) {
rename("/upload/$nom_fichier", "/upload/$nom_fichier$rand");
} else {
}
Mais marche pas
le code source est disponible a cetet adresse
J'espère que vous pourrez m'aider.
Bonne journée
Mais j'aimerais mettre en place un code qui renomme l'image si celle ci existe déja dans le répértoire d'upload. Exemple, si j'uplaode salut.png et que je le réuploade une deuxieme fois, j'aurais salut154.png.
Pour cela j'ai mis en place ceci :
$filename = '/upload/$nom_fichier';
$rand = 'rand(5, 50)';
if (file_exists($filename)) {
rename("/upload/$nom_fichier", "/upload/$nom_fichier$rand");
} else {
}
Mais marche pas
le code source est disponible a cetet adresseJ'espère que vous pourrez m'aider.
Bonne journée
Autres pages sur : resolu php renommer fichier existe
Lassé par la pub ? Créez un compte
Bien entendu, tu ne peux pas faire un rename alors que le fichier n'est pas encore copié.
Tu devrais plutôt faire:
D'ailleurs, je passe ton $rand avant pour ne pas te faire perdre l'extension.
Et un petit truc utile: lorsqu'on fait un système d'upload de fichiers destinés à être archivés, il est intéressant de TOUJOURS ajouter un identifiant unique, soit en utilisant uniqid() soit en faisant précéder le nom de (par exemple) date("YmdHis_").
Cela t'évite d'avoir à vérifier chaque fois si le fichier existe déjà, d'autant plus que le rand() peut te renvoyer plusieurs fois la même valeur.
Tu devrais plutôt faire:
if (file_exists("/upload/$nom_fichier")) {
$nom_fichier = $rand."_".$nomfichier;
}
D'ailleurs, je passe ton $rand avant pour ne pas te faire perdre l'extension.
Et un petit truc utile: lorsqu'on fait un système d'upload de fichiers destinés à être archivés, il est intéressant de TOUJOURS ajouter un identifiant unique, soit en utilisant uniqid() soit en faisant précéder le nom de (par exemple) date("YmdHis_").
Cela t'évite d'avoir à vérifier chaque fois si le fichier existe déjà, d'autant plus que le rand() peut te renvoyer plusieurs fois la même valeur.
si je comprends bien, tu veux renommer l'ancien puis copier le nouveau?
si c'est le cas, faudrait enlever le else
EDIT:
si file_exists () retourne vrai, il peut, mais il va renommer l'ancien
enfin ca depend de ce qu'il a voulu faire
si c'est le cas, faudrait enlever le else
EDIT:
crazycat@idn a dit :
Bien entendu, tu ne peux pas faire un rename alors que le fichier n'est pas encore copiési file_exists () retourne vrai, il peut, mais il va renommer l'ancien
enfin ca depend de ce qu'il a voulu faire
tout d'abord, "ça ne marche pas" n'est pas constructif.
Ensuite, tu devrais plutôt utiliser la fonction dédiée au déplacement de fichiers uploadés (move_uploaded_file()) plutôt que copy().
Et tu as une erreur (que je n'avais pas relevée):
depuis quand on met des ' ' autour d'un appel de fonction?
Ensuite, tu devrais plutôt utiliser la fonction dédiée au déplacement de fichiers uploadés (move_uploaded_file()) plutôt que copy().
Et tu as une erreur (que je n'avais pas relevée):
$rand = 'rand(5, 50)';
depuis quand on met des ' ' autour d'un appel de fonction?
Il ne veut toujours pas me modifier le fichier que je tente d'uploader uen deuxieme fois !
Acutellement j'ai ca :
J'ai msi a jour le fichier texte pour avoir une vue d'ensemble.
Pour le move_uploaded_file, je le mettrais surement lorsque mon problème sera réglé.
Acutellement j'ai ca :
$rand = rand(5, 50);
if (file_exists("/upload/$nom_fichier" )) {
$nom_fichier = $rand."_".$nomfichier;
}
J'ai msi a jour le fichier texte pour avoir une vue d'ensemble.
Pour le move_uploaded_file, je le mettrais surement lorsque mon problème sera réglé.
fais des affichages de debug pour savoir ce qui échoue.
Et je te signale une petite erreur en passant:
Un peu partout, tu utilises le répertoire /upload (donc à la racine de ton site) et là tu utilises un sous-répertoire du répertoire courant.
Donc, si ton script n'est pas à la racine de ton site, tu n'up pas dans le bon répertoire.
Et je te signale une petite erreur en passant:
copy($ftmp,"upload/".$nom_fichier);
Un peu partout, tu utilises le répertoire /upload (donc à la racine de ton site) et là tu utilises un sous-répertoire du répertoire courant.
Donc, si ton script n'est pas à la racine de ton site, tu n'up pas dans le bon répertoire.
par exemple:
Tu noteras que j'ai passé le rand() dans le if pour éviter de générer inutilement la variable.
if (file_exists("/upload/$nom_fichier" )) {
echo "-- On a déjà le fichier ".$nom_fichier." --<br />\n";
$rand = rand(5, 50);
echo "-- On a créé le préfixe ".$rand." --<br />\n";
$nom_fichier = $rand."_".$nom_fichier;
echo "-- Le nouveau nom de fichier est ".$nom_fichier." --<br />\n";
}
Tu noteras que j'ai passé le rand() dans le if pour éviter de générer inutilement la variable.
tout est affaire de configuration, je te conseille de jeter un oeil sur les variables de php.ini:
http://fr.php.net/manual/fr/ini.core.php#ini.include-pa... ainsi que les 2 suivantes (doc_root et user_dir).
Et à moins d'être sur un serveur qu'on maitrise parfaitement (un dédié), il est impossible d'accéder à un répertoire qui n'appartient pas à son espace web (ou espace personnel, selon la configuration).
http://fr.php.net/manual/fr/ini.core.php#ini.include-pa... ainsi que les 2 suivantes (doc_root et user_dir).
Et à moins d'être sur un serveur qu'on maitrise parfaitement (un dédié), il est impossible d'accéder à un répertoire qui n'appartient pas à son espace web (ou espace personnel, selon la configuration).
Regarde le fichier texte à cette adresse
J'ai noté aucune amélioration, ca n'affiche pas les echo que tu a mis.
J'ai noté aucune amélioration, ca n'affiche pas les echo que tu a mis.
if (file_exists("/upload/$nom_fichier" )) {
echo "-- On a déjà le fichier ".$nom_fichier." --<br />\n";
$rand = rand(5, 50);
echo "-- On a créé le préfixe ".$rand." --<br />\n";
$nom_fichier = $rand."_".$nom_fichier;
echo "-- Le nouveau nom de fichier est ".$nom_fichier." --<br />\n";
}
tout est dit dans la doc
rand() génère un nombre "aléatoire" entre 0 et 1. Dans ton cas (rand(5,50)), il va générer un nombre au hazard entre 5 et 50, ce qui veut dire que tu pourras au maximum avoir 45 images du même nom.
De plus, rien n'interdit à rand() de sortir plusieurs fois le même chiffre, et tu ne fais qu'une seule vérification, donc à terme tes probabilités d'écraser un fichier déjà existant sont assez énormes*.
uniqid() génère un nombre de 13 chiffres basé sur microtime() (les millisecondes système) et le préfixe donné (dans notre cas, rand()).
Les probabilités d'avoir deux fois le même uniqid de généré sont donc beaucoup plus faibles.
* Si tu savais le nombre de personnes qui vont envoyer un fichier appelé "logo.png", "avatar.gif" ou "moi.jpg"...
rand() génère un nombre "aléatoire" entre 0 et 1. Dans ton cas (rand(5,50)), il va générer un nombre au hazard entre 5 et 50, ce qui veut dire que tu pourras au maximum avoir 45 images du même nom.
De plus, rien n'interdit à rand() de sortir plusieurs fois le même chiffre, et tu ne fais qu'une seule vérification, donc à terme tes probabilités d'écraser un fichier déjà existant sont assez énormes*.
uniqid() génère un nombre de 13 chiffres basé sur microtime() (les millisecondes système) et le préfixe donné (dans notre cas, rand()).
Les probabilités d'avoir deux fois le même uniqid de généré sont donc beaucoup plus faibles.
* Si tu savais le nombre de personnes qui vont envoyer un fichier appelé "logo.png", "avatar.gif" ou "moi.jpg"...
je m'incruste avec mes questions mais crazy, effectivement j'avais jamais utilisé ces directives et comme je suis curieux
je les ai téstées.
ca ne m'a pas rendu le / = racine du site, par contre ca m'empeche d'aller lire un fichier en dehors du repertoire que j'ai indiqué
ex:
j'ai raté quelque chose?
je les ai téstées.ca ne m'a pas rendu le / = racine du site, par contre ca m'empeche d'aller lire un fichier en dehors du repertoire que j'ai indiqué
ex:
safe_mode = On
doc_root = "/var/www/html/php"
user_dir = "public_php"
j'ai raté quelque chose?
C'est le safe_mode qui te bloque.
Concernant le / qui représenterait la racine du site, je crois avoir fait une petite erreur (par omission): c'est la config d'apache qui permet cela.
Maintenant, je ne peux pas t'en dire plus car c'est quelque chose que j'ai rencontré sur le serveur d'un client (je me suis cassé les dents dessus pendant des heures) et je n'ai jamais tenté de le reproduire car c'est très chiatique à gérer (en temps que webmaster).
Concernant le / qui représenterait la racine du site, je crois avoir fait une petite erreur (par omission): c'est la config d'apache qui permet cela.
Maintenant, je ne peux pas t'en dire plus car c'est quelque chose que j'ai rencontré sur le serveur d'un client (je me suis cassé les dents dessus pendant des heures) et je n'ai jamais tenté de le reproduire car c'est très chiatique à gérer (en temps que webmaster).
crazycat@idn a dit :
soit en utilisant uniqid() soit en faisant précéder le nom de (par exemple) date("YmdHis_").okinou a dit :
moi je renomme avec l'id de la photo up (enregistre dans mysql) en md5 ou, avec la date entiere :yyyymmddHis
le md5() n'est pas bijectif, tu peux avoir 2 md5 identiques pour des chaines différentes.
La date est à priori unique et en plus elle permet un tri aisé.
ON VIENT DE TE DIRE QUE C'EST NORMAL, comment espère tu avoir une chaine unique si tu n'as que 2 caractère dans ta chaine ?
Ici avec uniqid tu as 22 caractère, md5 en créer 32.
SECONDE SOLUTION, ET DERNIERE FOIS QUE JE ME REPETE, tu utilises la DATE :
date("YmdHis_" )
ce qui te fera :
20070213010534 soit 14 caractere pour l'heure : 13 fevrier 2007 01:05:34 sec
Lis un peut ce que l'on te dit bordel !
Et pour finir, la doc, c'est magique :
http://fr.php.net/manual/fr/function.md5.php
http://fr.php.net/manual/fr/function.uniqid.php
http://fr.php.net/manual/fr/function.date.php
Ici avec uniqid tu as 22 caractère, md5 en créer 32.
SECONDE SOLUTION, ET DERNIERE FOIS QUE JE ME REPETE, tu utilises la DATE :
date("YmdHis_" )
ce qui te fera :
20070213010534 soit 14 caractere pour l'heure : 13 fevrier 2007 01:05:34 sec
Lis un peut ce que l'on te dit bordel !
Et pour finir, la doc, c'est magique :
http://fr.php.net/manual/fr/function.md5.php
http://fr.php.net/manual/fr/function.uniqid.php
http://fr.php.net/manual/fr/function.date.php
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumPhp renommer fichier upload
- ForumPhp renommer un fichier uploader
- ForumPhp renommer fichier uploadé
- ForumPhp upload renommer fichier
- ForumPhp tester si un fichier existe
- ForumPhp fichier existe joker
- ForumFonction php fichier existe
- ForumPhp verifier si fichier existe
- solutionsRenommer fichier uploader php
- ForumPhp savoir si un fichier existe.
- Voir plus