renommer un fichier uploadé

renommer un fichier uploadé - PHP - Programmation

Marsh Posté le 06-05-2007 à 12:47:06    

Bonjour,
 
j'ai codé un petit formulaire d'upload mais j'aimerai faire renommer automatiquement le nom du fichier (image) lorsqu'il est uploadé.
l'image est uploadée dans un dossier appellé "img" qui contient des images telles que:
1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg, ..., 88.jpg, 89.jpg, ... etc
 
Il faudrait que le nom du fichier soit "dernier numéro de l'image"+1.
exemple: si la dernière image est 312.jpg, le nom attribué devra être 313.jpg.
 
 
Puis-je avoir une esquisse du code et fonctions qui vont ouvrir le dossier img, parcourir les images pour en extraire uniquement le numéro (i.e "312".jpg) puis renommer le fichier uploadé?
 
merci d'avance.

Reply

Marsh Posté le 06-05-2007 à 12:47:06   

Reply

Marsh Posté le 06-05-2007 à 12:53:28    

salut :)
 
donc pour ça, perso je ne vois pas comment php pourrait savoir que t'as 312 est la dernière.
tu peux aussi les compter et faire un +1, mais si un jours tu en supprimes, je te dis pas le bordel (tu supprime une, au prochain upload la dernière sera ecrasée).
 
moi je vois bien un tri par nom, tu choppe le plus gros et tu fais un +1
 
:)

Reply

Marsh Posté le 06-05-2007 à 13:04:08    

naeh a écrit :


moi je vois bien un tri par nom, tu choppe le plus gros et tu fais un +1
:)


comment?

Reply

Marsh Posté le 06-05-2007 à 13:17:56    

tu parcours ton répertoire, tu mets les fichiers dans un tableau, tu lance un sort du tableau (php.net est ton ami pour les fonctions de tri de tableaux).
 
tu choppe le dernier enregistrement du tableau (forcément un 312 dans ton cas) et l'image uploadée aura ça + 1.
 
Exemple :

Code :
  1. $rep = "NOTRE/REPERTOIRE/";
  2. $dir = opendir($rep);
  3. while ($f = readdir($dir)){
  4. if(is_file($rep.$f)){
  5.  $liste[] = "$f"; //le nom du fichier
  6. }
  7. }


 
il te reste a trier $liste
à mon avis ça marche comme méthode, mais je trouve que c'est un peu du bidouillage, donc a toi de voir soit tu prends, soit tu cherche plus propre/performant :)


Message édité par naeh le 06-05-2007 à 13:20:37
Reply

Marsh Posté le 06-05-2007 à 13:20:11    

http://fr.php.net/max
 
S'il faut, tu splites tes chaines de caractères et tu recomposes le tableau avec uniquement les valeurs numérique.
 
Sinon, un tri alphabétique du tableau (voir du coté des fonction "sort" ) et tu récupère le dernier élément du tableau +1.

Reply

Marsh Posté le 06-05-2007 à 13:39:47    

Ou encore :

Code :
  1. $rep = './img/';
  2. $i=0;
  3. while(file_exists($rep.$i.'.jpg'))$i++
  4. // $i a pour valeur le premier numéro libre


Par contre là si tu en supprime un, il sera recréé par la suite.


Message édité par dwogsi le 06-05-2007 à 13:44:20

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 06-05-2007 à 13:40:58    

ok, la méthode du array me convient, sauf que j'ai du mal à en extraire la valeur maxi, autant avant sort() que max(), vu que ça me retourne le "index.html" que j'ai mis dans le repertoire. [:hahaguy]
ensuite à priori j'ai juste à faire un explode avec le ".jpg" pour extraire le numéro et faire un +1

Reply

Marsh Posté le 06-05-2007 à 13:44:28    

pour n'avoir que les images (donc pas le index.html) tu rajoute dans le if qui parcours le rep une condition par rapport a l'extension (tu la choppe avec strpos je crois) genre && $ext == 'jpg' et là t'es sur que dans ton tableau y'a que les images :)

Reply

Marsh Posté le 06-05-2007 à 13:46:26    

Code :
  1. $rep = "NOTRE/REPERTOIRE/";
  2. $dir = opendir($rep);
  3. while ($f = readdir($dir)){
  4. if(is_file($rep.$f) && substr($file,-3,3)=='jpg'){
  5.  $liste[] = substr($f,0,strlen($f)-4); //le nom du fichier sans l'extension
  6. }
  7. }
  8. $prochain = max($liste)+1;

Message cité 1 fois
Message édité par dwogsi le 06-05-2007 à 13:48:34

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 06-05-2007 à 13:55:12    

dwogsi a écrit :

Code :
  1. $rep = "NOTRE/REPERTOIRE/";
  2. $dir = opendir($rep);
  3. while ($f = readdir($dir)){
  4. if(is_file($rep.$f) && substr($file,-3,3)=='jpg'){
  5.  $liste[] = substr($f,0,strlen($f)-4); //le nom du fichier sans l'extension
  6. }
  7. }
  8. $prochain = max($liste)+1;



 
voilà ça c'est très proche de ce que je veux faire :)
sauf que:
 
Warning: Wrong parameter count for max() in C:\wamp\www\monsite\test\test.php on line 12
(ligne 12 contient ---> $prochain = max($liste)+1;)
j'ai essayé avec $prochain = max($liste); même erreur.
 
 :??:
 
edit:
print_r($liste);
ne retourne rien.


Message édité par pimsa le 06-05-2007 à 13:58:42
Reply

Marsh Posté le 06-05-2007 à 13:55:12   

Reply

Marsh Posté le 06-05-2007 à 13:58:53    

Code :
  1. $rep = "NOTRE/REPERTOIRE/";
  2. $liste = array();
  3. $dir = opendir($rep);
  4. while ($f = readdir($dir)){
  5. if(is_file($rep.$f)){
  6.                 list($file,$ext) = explode('.',$f);
  7.                 if(is_numeric($file)&&$ext=='jpg') $liste[] = $file;
  8. }
  9. }
  10. $prochain = max($liste)+1;


Ca devrait marcher. Je suppose...
En supposant que tes noms de fichiers ne contiennent pas de point.

Message cité 2 fois
Message édité par dwogsi le 06-05-2007 à 14:00:11

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 06-05-2007 à 14:02:00    

dwogsi a écrit :

Code :
  1. $rep = "NOTRE/REPERTOIRE/";
  2. $liste = array();
  3. $dir = opendir($rep);
  4. while ($f = readdir($dir)){
  5. if(is_file($rep.$f)){
  6.                 list($file,$ext) = explode('.',$f);
  7.                 if(is_numeric($file)&&$ext=='jpg') $liste[] = $file;
  8. }
  9. }
  10. $prochain = max($liste)+1;


Ca devrait marcher. Je suppose...
En supposant que tes noms de fichiers ne contiennent pas de point.


 
yep. merci dwogsi, merci naeh, merci c0wb0y  :jap:

Reply

Marsh Posté le 06-05-2007 à 18:41:35    

dwogsi a écrit :

Code :
  1. $rep = "NOTRE/REPERTOIRE/";
  2. $liste = array();
  3. $dir = opendir($rep);
  4. while ($f = readdir($dir)){
  5. if(is_file($rep.$f)){
  6.                 list($file,$ext) = explode('.',$f);
  7.                 if(is_numeric($file)&&$ext=='jpg') $liste[] = $file;
  8. }
  9. }
  10. $prochain = max($liste)+1;


Ca devrait marcher. Je suppose...
En supposant que tes noms de fichiers ne contiennent pas de point.


 
php.net ne recommande pas ton écriture : http://fr.php.net/manual/fr/function.readdir.php
while ($f = readdir($dir)) à remplacer par while (false !== ($file = readdir($dir)))
je ne sais pas pourquoi, ss doute une Q? de charge du serveur ?

Reply

Marsh Posté le 06-05-2007 à 20:25:19    

Citation :

toute entrée dans le nom serait évalué à FALSE causera l'arrêt de la boucle (exemple, un répertoire nommé 0).


Se produit donc dans de rares cas mais peut tout de même se produire. Ceci dit quand on sait quels genre de noms vont prendre les fichiers et répertoire on peut s'affranchir de cette écriture.


Message édité par dwogsi le 06-05-2007 à 20:26:21

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed