Limiter la longueur max nom d'un fichier

Mammouth du PHP | 2278 Messages

07 août 2012, 09:27

Bjr:
Remarque générale:
qu'une fonction ait plusieurs points de sorties, en particulier dans des if, est souvent générateur d'erreurs, car on ne peut pas prévoir la valeur retournée.
Quelques détails ci-dessous
// Fonction de renommage : si fichier.ext existe, renomme en fichier1.ext ; si fichier1.ext existe, renomme en fichier2.ext etc..
//parametre $adresse_fichier
function Rename_fich($adresse_fichier)

{
//Si le fichier existe et est un fichier valide
if (is_file($adresse_fichier))
{
// on réaffecte la variable $adresse_fichier avec $DESTINATION_FOLDER
$adresse_fichier = $DESTINATION_FOLDER; // avec ; , c'est mieux
//une vérification instructive:
var_dump($adresse_fichier);
//que suivra une autre vérification instructive:
var_dump( $DESTINATION_FOLDER);
$info = pathinfo($adresse_fichier);
$extension = $info['extension'];
$filename = $info['filename'];
$dossier = $info['dirname'];

// Cherche dans le nom de fichier des caractères numériques en fin de nom et si oui incrémente ce nombre grâce à la fonction anonyme create_function

// que suivra un intéressant:
var_dump($nomFichier);
$nomFichier = preg_replace_callback('#([0-9]+$)#', create_function('$matches','return $matches[1]+1;'), $nomFichier, '1', $count);

// Si des caractères numériques sont trouvés et incrémentés (le paramètre $count employé dans preg_replace_callback indique le nombre de remplacements), $filename prend sa nouvelle valeur, sinon l'ancienne concaténée à 1
$nomFichier = !empty($count)? $nomFichier : $nomFichier.'1';

// Reconstruction du nom de fichier avec son extension (si elle existe)
$nomFichier = !empty($extension) ? $nomFichier.'.'.$extension : $nomFichier;

// Reconstruction de l'adresse du fichier
$adresse = $dossier.'/'.$nomFichier;

// Appel de la fonction pour re vérification avec le nouveau nom du fichier
return Rename_fich($adresse);

}

// Retourne le chemin complet du fichier
else return $adresse_fichier;
}
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 55 Messages

07 août 2012, 11:26

Bonjour,

Effectivement xTG c'est cela qui rajoutait l'extension en deux fois. Merci.

sirakawa je te remercie de vouloir m'aider, j'ai essayer ton code a la place de l'ancien mais sa ne fonctionne toujours pas, il me remet le premier fichier uploader.

Merci d'avance pour vos solutions.

Mammouth du PHP | 2278 Messages

07 août 2012, 12:44

Bjr,
Je ne me permettrais pas de mettre en ligne et en réponse du code qui ne fonctionne pas. Mais il fallait le comprendre et le compléter, ce que j'avais dit.
La question à laquelle il répondait était de se débarrasser des caractères accentués et de limiter la longueur.
Quant à avoir un nom de fichier unique, au lieu de s'enquiquiner avec des lots de preg_machin, il suffit de stocker dans un fichier last.txt la valeur du dernier enregistré et de l'incrémenter après création réussie du fichier.

Code : Tout sélectionner

lecture dans last.txt de $last $last ++; création du nom par adjonction de $last; enregistrement réussi => écriture de $last dans last.txt dans tous les cas fermeture de last.txt
Salut.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 55 Messages

07 août 2012, 12:55

D'accord mais moi je parle de la fonction de renommage qui ne fonctionne pas.

J'ai réussi a trouver pour limiter la longueur mais maintenant c'est pour le renommage que je n'arrive pas.

Merci d'avance.

Mammouth du PHP | 2278 Messages

07 août 2012, 13:42

ma fonction d erenommage fonctionne parfaitement:
vd/tot!oéèuù.jpg devient tot_oeeuu.jpg
évidemmment, dans la version que j'ai postée, j'avais mis exprès un fichier .gif et pas l'extension .gif dans les extensions acceptables; il est normal que dans ce cas la fonction renvoie faux...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 55 Messages

07 août 2012, 19:48

Oui d'accord, mais moi je voudrais juste que sa rajoute au fichier un 1 à la fin ou un 2 si le 1 existe et ainsi de suite.

Cordialement,

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 août 2012, 21:37

La notion de "juste" en informatique est loin d'être évidente ... tu n'imagines pas tout ce qui se passe quand tu appuies "juste" sur le bouton de ton pc pour le démarrer... ben là, c'est pareil :)

Il y a probablement autant de méthodes que de développeurs (si ce n'est plus), les plus simples étant rarement les plus optimisées, et encore moins les plus sûres.

En mode "cochon", tu peux tester l'existence de 1.txt avec file_exists(). Si tu le trouves, tu recommences avec 2.txt et ainsi de suite jusqu'à ce que tu ne trouves pas de fichier avec ce nom. Tu pourras alors enregistrer ton fichier. Si tu n'en as que 10 sur le disque et que tu veux enregistrer le 11è, ça va, si tu en as déjà 10.000 ca prendra "juste" 10 fois plus de temps..

La suggestion de sirakawa de stocker le dernier id en base ou dans un fichier te permet de pouvoir immédiatement connaitre le suivant sans tester l'ensemble des fichiers déjà présent. La difficulté ensuite est de gérer deux demandes simultanées pour éviter que les fichiers n'aient le même numéro et ne s'écrasent...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 2278 Messages

07 août 2012, 21:53

oui ryle: il faut peut-être aller voir du côté des verrous.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 55 Messages

07 août 2012, 22:28

Ok d'accord c'est pas si simple que ça :s

Et je pensais si on vérifie que le fichier est déjà présent (file_exists()).

Au lieu d'ajouter un chiffre a la fin, on fait apparaître au début du nom du fichier la date d'upload du fichier, ça ne serait pas plus simple a mettre en fonctionnement (il n'y aurait plus a vérifier la présence existante d'un 1, d'un 2 ... ?

Cordialement,

Mammouth du PHP | 2278 Messages

07 août 2012, 22:49

La date insuffisant, jour.heure :peut être, ou le time stamp...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 55 Messages

07 août 2012, 23:53

Alors voilà j'ai essayer ceci:
$nomFichier =substr($nomFichier, 0, 15).strtolower($extension);
                          
                                
                                // Ensuite, on copie le fichier uploadé ou bon nous semble.
				$uploadOk = move_uploaded_file($nomTemporaire, $DESTINATION_FOLDER.$nomFichier);
				if($uploadOk){

 
if (file_exists("$nomFichier" )) {

$rand = date("YmdHis");
$nomFichier = $rand."_".$nomFichier;

}
Sa m'a amener sur la page suivante le fichier a été renommé avec la date devant mais il n'as pas été uploader ! J'ai vérifier dans le ftp le fichier n'y est pas.
Nouveau nom de fichier: 20120807235220_Counter-Strike-.jpg

Auriez vous une idée de pourquoi sa ne l'upload pas ? J'ai suivi ceci: http://www.infos-du-net.com/forum/26271 ... xiste-deja

Merci d'avance

ViPHP
xTG
ViPHP | 7331 Messages

08 août 2012, 06:54

C'est le move_uploaded_file qui enregistre le fichier. :roll:

Mammouth du PHP | 2278 Messages

08 août 2012, 12:16

$DESTINATION_FOLDER.$nomFichier et $nomFichier, ce n'est pas le même fichier
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 55 Messages

08 août 2012, 15:01

Bonjour,

Alors actuellement le fichier uploader.php est dans le dossier a la racine du ftp et j'aimerais que les fichiers uploader aille dans le dossier 'up'

Donc j'ai mis ca en destination: $DESTINATION_FOLDER = $_POST["up/"];

Mais sa ne fonctionne pas les fichiers s'upload dans le dossier racine ou il y a le fichier uploader.

Et en plus j'ai un dernier soucis les fichiers qui ne sont pas déjà existant donc qu'il n'y a pas besoin de renommer qui s'upload, s'upload actuellement avec une double extension (hortensia.jpg.jpg)

Alors que ceux qui sont renommer non qu'une extension.

Merci d'avance

ViPHP
ViPHP | 2577 Messages

08 août 2012, 15:49

$DESTINATION_FOLDER = "up/"; ?

Pour l'autre problème, faudrait voir le code...