Limiter la longueur max nom d'un fichier

Eléphant du PHP | 55 Messages

29 juil. 2012, 03:06

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,

ViPHP
xTG
ViPHP | 7331 Messages

29 juil. 2012, 12:03

Regardes du côté de la fonction substr(). ;)
Ou bien mb_substr() si tu travailles avec un autre encodage que l'iso.

Eléphant du PHP | 55 Messages

03 août 2012, 01:35

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

ViPHP
xTG
ViPHP | 7331 Messages

03 août 2012, 06:52

Il faut bien évidemment le faire avant le move.
Montres nous ta tentative qu'on puisse te dire ce qui ne va pas.

Eléphant du PHP | 55 Messages

03 août 2012, 14:19

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

ViPHP
xTG
ViPHP | 7331 Messages

03 août 2012, 20:14

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().

Eléphant du PHP | 55 Messages

03 août 2012, 22:04

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

ViPHP
xTG
ViPHP | 7331 Messages

04 août 2012, 09:21

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

Mammouth du PHP | 2278 Messages

04 août 2012, 10:26

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";
} 
?>
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
xTG
ViPHP | 7331 Messages

04 août 2012, 11:51

Je suis pas certain que cela fonctionne avec de l'utf8 par contre ta fonction sirakawa, tu pourrais nous confirmer ?

Mammouth du PHP | 2278 Messages

04 août 2012, 12:11

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
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

06 août 2012, 23:06

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 !

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

06 août 2012, 23:41

Il te manque un " ; " à la fin de l'instruction précédente ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 55 Messages

07 août 2012, 00:44

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.

ViPHP
xTG
ViPHP | 7331 Messages

07 août 2012, 06:54

Tu as un substr après ta fonction rename.