Page 1 sur 1
upload espace et caractère accentué dans le nom du fichier
Posté : 21 févr. 2007, 18:15
par stefane321
Bonjour,
J'ai un script qui sert à uploader des images sur mon site Web.
Si il y a un espace ou un caractère accentué dans le nom du fichier bien le fichier est uploadé mais le navigateur Web (Internet Explorer) n'affiche pas l'image.
J'aimerais savoir comment enlever les espaces et caractère accentué du nom du fichier avant de l'uploader SVP.
Voici mon code original:
if($_FILES["images"]['name'] <> "")
{
$extptmp = explode(".",$_FILES["images"]['name']);
if(is_uploaded_file($_FILES["images"]['tmp_name']))
{
move_uploaded_file($_FILES["images"]['tmp_name'], "".$pathImg."photos/img_prod/".$_FILES["images"]['name']."");
$sqlup = "UPDATE photos SET image=\"".$_FILES["images"]['name']."\" where id=$id";
$conn = mysql_connect($host, $login, $password) or die ("Erreur de connection");
mysql_select_db($db) or die("erreur de DB");
$rsup = mysql_query($sqlup) or die ($sqlup);
mysql_close($conn);
}
Merci!
Posté : 21 févr. 2007, 18:35
par Ryle
"Avant de l'uploader" faut demander à l'utilisateur de le faire... mais on sait comment ca fonctionne un utilisateur, même si tu leurs demandes...
Il faut donc modifier le nom du fichier lorsque tu le récupères et que tu fais le move_uploaded_file(), il suffit de modifier le nom que tu donnes au fichier. Au lieu de $_FILES["images"]['name'] (qui est le nom d'origine) il suffit de faire un str_replace() des caractères que tu ne souhaites pas trouver par ceux avec lesquels tu veux les remplacer

(ex : "é" par "e", " " par "_", etc.)
Tu as des exemples dans les commentaires de la fonction

Sa marche pas!
Posté : 01 mars 2007, 23:54
par stefane321
J'ai essayer avec str_replace() et strtr() afin d'enlever les caractères accentués mais il ne se passe rien.
Notez que mon problème initiale qui était d'enlever les espaces
est réglé, sa fonctionne.
if($_FILES["images"]['name'] <> "")
{
$extptmp = explode(".",$_FILES["images"]['name']);
$_FILES["images"]['name'] = str_replace(" ","_",$_FILES["images"]['name']);
$recherche = array("ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ");
$remplace = array("AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy");
$images = strtr($_FILES["images"]['name'],$recherche,$remplace);
if(is_uploaded_file($_FILES["images"]['tmp_name']))
{
move_uploaded_file($_FILES["images"]['tmp_name'], "".$pathImg."photos/img_prod/".$images."");
$sqlup = "UPDATE photos SET image=\"".$images."\" where id=$id";
$conn = mysql_connect($host, $login, $password) or die ("Erreur de connection");
mysql_select_db($db) or die("erreur de DB");
$rsup = mysql_query($sqlup) or die ($sqlup);
mysql_close($conn);
}
}
Sa ne fait aucun changement à mon nom de fichier.
Avez-vous une idée?
Posté : 02 mars 2007, 01:33
par AB
Bonjour,
essaies plutôt :
//remplacement lettres accentuées par équivalent
$nom_fichier = strtr($nom_fichier_original,
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
//n'autorise que les lettres et les chiffres et les caractères '_' et '-'; remplace tous les autres caractères par '-'
$nom_fichier = preg_replace('/([^.a-z0-9_-]+)/i', '-', $nom_fichier);
Marche Pas!
Posté : 02 mars 2007, 05:03
par stefane321
Sa ne fonctionne pas.
Sa renomme toujours mon fichier qui contient un accent -y-.JPG
J'ai fouillé sur Google et dans plusieurs autres forum il offre la même solution que tu m'as offerte mais sa ne fonctionne pas.
As-tu une idée du problème?
Merci!
Posté : 02 mars 2007, 17:28
par AB
Bonjour,
Testes les lignes de codes ci-dessus dans un fichier isolé avec des exemples. Normalement ça fonctionne. Si oui, c'est que ton pb ne vient pas de ces lignes de code mais d'une erreur ailleurs dans ton code.
Posté : 02 mars 2007, 18:04
par jojolapine
bonjour, je voudrais simplement signaler, que garder le nom de fichier de l'utilisateur est une mauvaise idée (même s'il est épuré de tout caractère génant) car plusieurs utilisateurs peuvent uploader des fichiers différents, avec un même nom, dans ce cas, écrasement des fichiers sur le serveur...
La meilleur solution reste de déterminé un nom grace à uniqid() ou microtime() et éventuellement associé l'id du membre...
Ou alors avoir une table mysql qui incrémente un identifiant quelquonque...
Posté : 03 mars 2007, 23:32
par AB
Bonsoir,
Pour compléter la remarque pertinente de jojolapine, on peut aussi envisager (ce que je fais dans mes scripts) de faire un file_exists() du nom du fichier modifié sur le repertoire de téléchargement.
Si oui, je zap l'étape du téléchargement et je fais afficher un message de type 'le fichier nommé "nomdufichier" existe déjà. Renommez votre fichier avant le téléchargement'.
C'est moins automatique que la suggestion de jojolapine mais cela permet à l'utilisateur de maîtriser le nom du fichier uploadé.
En préalable, j'indique que les fichiers ne doivent pas comporter de caractères accentués, ou spéciaux etc...et que les fichiers non conforme seront renommés.
Par ailleurs, je fais une confirmation du téléchargement du fichier uploadé
du type :
- 'le fichier "nomdufichieroriginal" a été téléchargé avec succès.
et si le fichier uplodé a été renommé (remplacement des caractères spéciaux ou accentués) :
- 'le fichier "nomdufichieroriginal" renommé ""nomdufichiermodifié" 'a été téléchargé avec succès.
Je fais cela pour des pages administrateur (contenu cms) car je préfère que l'administrateur garde le maximum de contrôle sur le nom de ses fichiers.
Mais pour des utilisations autres ex: un visiteur veut simplement uploader une image pour l'afficher sur le site, la solution de jojolapine sera plus adaptée.