Page 1 sur 3

Limiter la longueur max nom d'un fichier

Posté : 29 juil. 2012, 03:06
par JcLoD
Bonjour,

J'utilise actuellement un script d'upload php pour uploader plusieurs fichiers, mais j'aimerais limiter la longueur maximal d'un nom d'un fichier lors de l'upload pour pas qu'il est des liens très long.

ex: imageedededjjdchdyezususisisooqpqpn.png
devient: imageedededjj.png

Une limite de 15 caractères max on va dire.

Je suppose que la variable sera a placer près de la variable d'upload: (move_uploaded_file())

Merci d'avance pour votre aide et vos réponses !

Cordialement,

Re: Limiter la longueur max nom d'un fichier

Posté : 29 juil. 2012, 12:03
par xTG
Regardes du côté de la fonction substr(). ;)
Ou bien mb_substr() si tu travailles avec un autre encodage que l'iso.

Re: Limiter la longueur max nom d'un fichier

Posté : 03 août 2012, 01:35
par JcLoD
Bonjour,

Veuillez m'excusez de la réponse tardive. J'ai regarder un peu l'utilisation de la fonction, je suis tombé sur ça: http://php.net/manual/fr/function.mb-substr.php

J'ai regarder plusieurs commentaires, j'ai essayer plusieurs manip mais je n'arrive pas a la mettre en place.

Mon bout de code de mon script:
// Vérifier si le fichier a une extension autorisée
			if(isExtAuthorized($extension)){
				$nomFichier = strtr($nomFichier, 
                        'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
                        'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
                        $nomFichier = preg_replace('/([^.a-z0-9]+)/i', '-', $nomFichier);
                               
 // Copié le fichier uploader a l'endroit voulu.
				$uploadOk = move_uploaded_file($nomTemporaire, $DESTINATION_FOLDER.$nomFichier);
J'avais essayer de mettre la fonction avant et après le move_uploaded_file mais aucune des deux n'a fonctionné.

Merci d'avance

Re: Limiter la longueur max nom d'un fichier

Posté : 03 août 2012, 06:52
par xTG
Il faut bien évidemment le faire avant le move.
Montres nous ta tentative qu'on puisse te dire ce qui ne va pas.

Re: Limiter la longueur max nom d'un fichier

Posté : 03 août 2012, 14:19
par JcLoD
D'accord voici ce que j'ai essayer:

Avec les fonctions plus haut j'ai mis ça:
function substr_unicode($str, $s, $l = null) {
    return join("", array_slice(
        preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $s, $l));
}
// Vérifier si le fichier a une extension autorisée
			if(isExtAuthorized($extension)){
				$nomFichier = strtr($nomFichier, 
                        'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
                        'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
                        $nomFichier = preg_replace('/([^.a-z0-9]+)/i', '-', $nomFichier);


if(substr_unicode($str, $s, $l = null)){
$str = "Büyük";
$s = 0; // start from "0" (nth) char
$l = 3; // get "3" chars
echo substr($str, $s, $l) ."\n";    // Bü
echo mb_substr($str, $s, $l) ."\n"; // Bü
echo substr_unicode($str, $s, $l);  // Büy

                               
 // Copié le fichier uploader a l'endroit voulu.
				$uploadOk = move_uploaded_file($nomTemporaire, $DESTINATION_FOLDER.$nomFichier);
Merci d'avance

Re: Limiter la longueur max nom d'un fichier

Posté : 03 août 2012, 20:14
par xTG
Des soucis avec la compréhension de l'utilisation des fonctions il semblerait.

Petit rappel alors :
// déclaration d'une fonction
function test($var1, $var2 = 2){
  // $var1 doit être renseignée
  // $var2 si elle n'est pas renseignée sera créée avec la valeur 2.

  return $var1 * $var2;
}

$maVariable = 1;
$maVariable2 = 80;
// utilisation de la fonction
$retour = test(5); // correspond en fait à test(5,2)
$retour = test($maVariable, $maVariable2);
Mais surtout c'est bien joli ton copier/coller... Mais il agit sur quoi ?
Sur rien justement, tu as copier/coller un exemple de la doc sans le comprendre.
Cela ne fonctionne pas par magie, il faut adapter à ton code.
C'est la variable $nomFichier qui doit être raccourcie.
Sachant que cette variable contient aussi l'extension, donc il faut la récupérer pour pouvoir la remettre après le mb_substr().

Re: Limiter la longueur max nom d'un fichier

Posté : 03 août 2012, 22:04
par JcLoD
Ca marche mais le souci sa ne coupe pas le nom du fichier sa met un nom différent (Büyük) et comme tu l'a dit xTG sa ne récupère pas l'extension et moi j'aimerais que ca garde le nom du fichier de la personne en le coupant a tant de caractère voulu.

Au niveau de la fonction j'ai donc mis ceci:
function substr_unicode($nomFichier, $s, $l = null) {
    return join("", array_slice(
        preg_split("//u", $nomFichier, -1, PREG_SPLIT_NO_EMPTY), $s, $l));
}
$nomFichier = "Büyük";
$s = 0;
$l = 3;
                               
 // Ensuite, on copie le fichier uploadé ou bon nous semble.
				$uploadOk = move_uploaded_file($nomTemporaire, $DESTINATION_FOLDER.$nomFichier);
Je ne vois pas comment récupérer l'extension du fichier.

Aidez moi s'il vous plaît. Merci d'avance

Re: Limiter la longueur max nom d'un fichier

Posté : 04 août 2012, 09:21
par xTG
Bah si Büyük est ton nom de fichier il n'a pas d'extension...
Sinon pour récupérer facilement une extension tu peux utiliser ce code :
function getExt($filename, $encoding = 'UTF-8'){
  mb_internal_encoding($encoding);
  mb_regex_encoding($encoding);
  $tmp = mb_split('.',$filename);
  if( size($tmp) > 1 ){
    return '.' . $tmp[size($tmp) - 1];
  }
  return '';
}
echo getExt('nomFichier.ext'); // .ext
echo getExt('image.jpeg'); // .jpeg
echo getExt('objet.class.php'); // .php
echo getExt('test'); // retournera une chaîne vide

Re: Limiter la longueur max nom d'un fichier

Posté : 04 août 2012, 10:26
par sirakawa
Voici le fruit de mes cogitations, largement à compléter pour être vraiment opérationnel,
Ceci dit, je pense qu'il serait beaucoup plus simple de donner un nom arbitraire unique, facile à créer, basé sur date et heure par exemple... L'inconvénient en est de perdre le rapport avec le nom d'origine...
<?PHP
/*
fonction transforme  ($chemin_fic, $nombre)
paramètres : un chemin de fichier, le nombre de caractères à garder
retourne un tableau :
$acceptable : booléen : extension acceptée
$nom_pur :le nom sans accents et réduit à $nombre caractères
$extension l'extension avec son point
$nom_final :le nom nouveau complet
Pour bien faire il faudrait vérifier que ce nom n'existe pas déjà...
*/
function transforme_nom($chemin_fic, $nombre)
{
	$accents = array("é","è","ç","à","ù", "!"); //à compléter avec tous les caractères à remplacer
	$remplacants = array("e","e","c","a","u","_"); //à compléter sinon les caractères sans équivalent sont supprimés		
	//en premier, car on signale un problème avec basenom si le nom compore des accents
	$nom_fic = str_replace ($accents, $remplacants, $chemin_fic); 
	$acceptables = array(".jpg",".jpeg", ".JPG");// à compléter maj/min
	$nom_fic = basename ($nom_fic);// le nom du fichier sans son chemin avec son extension
	$pos_point = strrpos($nom_fic, "."); // position du premier point à partir de la fin du nom de fichiet
	$extension = substr($nom_fic, $pos_point);
	$acceptable = in_array($extension, $acceptables); // test de l'extension
	$nom_pur = "";
	$nom_final = "";
	if ($acceptable === true)
	{
		
		$nom_pur = basename($nom_fic, $extension);//le nom sans l'extension sera réduit par substr ci-dessous
		$nom_final =substr($nom_pur, 0, $nombre).strtolower($extension);
	}

	
	return array ($acceptable, $nom_pur, $extension, $nom_final);
}


$nomfic = "vd/tot!oéèuù.gif";
$resultat =transforme_nom($nomfic, 15);
if ($resultat[0] === true)
{
	$nouveau_nom = $resultat[3];
	print "$nouveau_nom";
} 
?>

Re: Limiter la longueur max nom d'un fichier

Posté : 04 août 2012, 11:51
par xTG
Je suis pas certain que cela fonctionne avec de l'utf8 par contre ta fonction sirakawa, tu pourrais nous confirmer ?

Re: Limiter la longueur max nom d'un fichier

Posté : 04 août 2012, 12:11
par sirakawa
Je suis pas certain que cela fonctionne avec de l'utf8 par contre ta fonction sirakawa, tu pourrais nous confirmer ?
C'était et c'est enregistré en UTF-8 (machine Fedora 17)
j'ai ajouté:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head>
	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
 </head>
et ça fonctionne ici

Re: Limiter la longueur max nom d'un fichier

Posté : 06 août 2012, 23:06
par JcLoD
Bonjour,

Merci pour vos réponses j'ai trouver ce qu'il me fallait: $nomFichier =substr($nomFichier, 0, 15).strtolower($extension);

Je rencontre un nouveau souci au niveau du renommage des fichiers, j'ai essayer de mettre en place le renommage des fichiers en suivant ceci: faq-tutoriels/telechargement-fichiers-a ... 53523.html

Voilà ce que j'ai mis en place au niveau des fonctions:
// Fonction de renommage : si fichier.ext existe, renomme en fichier1.ext ;  si fichier1.ext existe, renomme en fichier2.ext etc..
function Rename_fich($adresse_fichier)

    {
      //Si le fichier existe et est un fichier valide
      if (is_file($adresse_fichier))
              {
                  // Informations sur le fichier
                  $adresse_fichier = $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
                  $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;
    }
et au niveau de la fonction d'upload:
$nomFichier = strtr($nomFichier, 
                        'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
                        'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
                        $nomFichier = preg_replace('/([^.a-z0-9]+)/i', '-', $nomFichier);
				$nomFichier =substr($nomFichier, 0, 15).strtolower($extension);
                                $adresse_fichier = Rename_fich($adresse_fichier);
                                $nomFichier =substr($nomFichier, 0, 20).strtolower($extension);
                                //Copié le fichier uploader a l'endroit voulu.
				$uploadOk = move_uploaded_file($nomTemporaire, $DESTINATION_FOLDER.$nomFichier);
				if($uploadOk){
Quand j'essai d'uploader un fichier sa me renvoi une erreur à cette ligne: $info = pathinfo($adresse_fichier);
Parse error: syntax error, unexpected T_VARIABLE in /home/florianl/public_html/****/up/uploader.php on line "le numéro de la ligne"

Merci d'avance pour votre aide !

Re: Limiter la longueur max nom d'un fichier

Posté : 06 août 2012, 23:41
par Ryle
Il te manque un " ; " à la fin de l'instruction précédente ;)

Re: Limiter la longueur max nom d'un fichier

Posté : 07 août 2012, 00:44
par JcLoD
Effectivement sa venait de la, merci. Mais le renommage n'a pas l'air de fonctionner.

J'ai essayer d'uploader deux fichiers:
Counter-Strike [2011-10-27 17-02-28].jpg
Counter-Strike [2011-10-27 17-02-27].jpg

le premier il me la transformer en: Counter-Strike-.jpg.jpg
le deuxieme il ma donner le 1er screen: Counter-Strike-.jpg.jpg

Donc le renommage ne fonctionne pas et il me double l'extension.

Bizzare, merci d'avance pour vos solutions.

Re: Limiter la longueur max nom d'un fichier

Posté : 07 août 2012, 06:54
par xTG
Tu as un substr après ta fonction rename.