OVH Cloud OVH Cloud

Tester la validite du nom d'un fichier uploade ?

45 réponses
Avatar
paul
Bonjour,

je voudrais vérifier la validité du nom d'un fichier photo uploadé (pas
de caractère accentué, d'espace,...).

J'ai mon champ input :
<input type="file" name="submitfiles[]" size="50">


J'ai essayé ce code :

if(ereg('[^[:space:]a-zA-Z0-9_.-]{1,}',
$HTTP_POST_FILES["submitfiles"]))
{
die ("<span class='attention'>Nom de fichier non
valide.<br><input type='button' value='Modifier'
onclick='goBack();'></span>");
}
else
{
include ("upload.php");
}




Mais ça ne fonctionne pas, je n'arrive pas à rentrer dans le if(ereg(...
:-((

Vous savez pourquoi ?
A cause du $HTTP_POST_FILES["submitfiles"] mal écrit ?


Merci pour votre aide !

Paul

10 réponses

1 2 3 4 5
Avatar
paul
In article <45a40e60$,
Olivier Miakinen <om+ wrote:


Essaye plutôt :
<?php
header("Content-Type", "text/html; charset=utf-8");
?>


Aïe... j'ai mis ce code entre les <head></head> à la place du (pouah...)
:
<meta http-equiv="content-type" content="text/html; charset=utf-8">

et j'obtiens :

Internal Server Error


J'aurais dû vérifier avant d'envoyer, mais j'étais un peu en retard.
En réalité c'était :
header("Content-Type: text/html; charset=UTF-8");


J'avais modifié après une petite recherche sur Google...

Cela dit, comme il s'agit d'envoyer l'information dans les entêtes HTTP
plutôt que dans la page HTML, cette instruction est à mettre en *tout
premier*, avant que le moindre octet ait pu être transmis.
Voir <http://faqfclphp.free.fr/#rub2.12>.


Je l'ai donc placé en tout premier, même avant
session_start();
Mais malheureusement j'ai toujours l'erreur 500 : Internal Server Error
:-(


BBEdit me le signale en UTF8 no-BOM


Ça c'est parfait.


C'est déjà ça de pris !


Je vais revenir sur ton article précédent maintenant.


Merci de consacrer du temps à ce problème.

Paul



Avatar
paul
In article <45a4120b$,
Olivier Miakinen <om+ wrote:


Veux-tu faire un essai ? Tu sépares cette instruction en deux, et tu
affiches le résultat d'abord du strtolower() puis du htmlentities(),
avec les noms de fichiers suivants :
UnB½uf.jpg
1


Un¼uf.jpg
2


ÇaCoûteZéro¤Pièce.jpg
3


Attention :
pour corser le tout, j'ai des problèmes de copier/coller des caractères
accentués dans mon soft de news depuis toujours (sans que ce pb soit
mettre en relation avec celui qui nous occupe...). Bref j'ai dû retaper
à la main certains résultats accentués. J'espère ne rien avoir faussé !

OK les résultats :

A - strtolower() seul
1 - unb½uf.jpg
2 - un¼uf.jpg
3 - Çacoûtezéro¤pièce.jpg

(les fichiers sont correctement traités par imageMagick)

B - htmlentities() seul
1 - UnB&Aring; (dans base mySQL) / 2 fichiers générés dans
l'arborescence : UnB&Aring;ì

Avatar
Olivier Miakinen

UnB½uf.jpg
1


Un¼uf.jpg
2


ÇaCoûteZéro¤Pièce.jpg
3



Ah, ton logiciel de nouvelles a du mal avec le Latin9 et a tout
transformé en Latin1. Ce n'est pas grave parce que le Ç majuscule
est resté, lui.

Attention :
pour corser le tout, j'ai des problèmes de copier/coller des caractères
accentués dans mon soft de news depuis toujours (sans que ce pb soit
mettre en relation avec celui qui nous occupe...). Bref j'ai dû retaper
à la main certains résultats accentués. J'espère ne rien avoir faussé !


Le test est différent de ce que je pensais, mais c'est sans importance.

OK les résultats :

A - strtolower() seul
1 - unb½uf.jpg
2 - un¼uf.jpg
3 - Çacoûtezéro¤pièce.jpg


Comme je le disais, le strlower a fonctionné sur les majuscules ASCII
(non accentuées) mais pas sur le Ç.

(les fichiers sont correctement traités par imageMagick)

B - htmlentities() seul
1 - UnB&Aring; (dans base mySQL) / 2 fichiers générés dans
l'arborescence : UnB&Aring;ì


Ah ! Finalement tu avais bien « œ » dans ton fichier de test. Ce
caractère a pour code C5 93 en UTF-8. Lu par une fonction qui croit
avoir de l'ISO-8859-1 (comme htmlentities), il s'agit d'un caractère de
valeur C5, soit « Å », suivi par un caractère de valeur 93 qui n'existe
pas dans ISO-8859-1 (en Windows-1252 c'est le symbole de fonction,
&fnof; en entités HTML). Il est donc normal que ton htmlentities ait
donné un « &Aring; », mais le « ì » je ne sais pas d'où il vient (sauf
qu'un caractère invalide doit pouvoir donner à peu près n'importe quoi).

En conclusion : ton fichier est bien en UTF-8, et tu utilises bien une
fonction inadaptée.


Avatar
paul
In article <45a4a33e$,
Olivier Miakinen <om+ wrote:

En conclusion : ton fichier est bien en UTF-8, et tu utilises bien une
fonction inadaptée.


Argh... Il fallait s'y attendre...

Mais alors que faire ?


Quelle est la formule magique pour dire que dans une chaîne UTF8 il faut
remplacer par rien les caractères autres que les alphanumériques et les
accentués ?

Avatar
paul
In article ,
paul wrote:

OK les résultats :

A - strtolower() seul
1 - unb½uf.jpg
2 - un¼uf.jpg
3 - Çacoûtezéro¤pièce.jpg

(les fichiers sont correctement traités par imageMagick)

B - htmlentities() seul
1 - UnB&Aring; (dans base mySQL) / 2 fichiers générés dans
l'arborescence : UnB&Aring;ì



Tiens mon message a été tronqué (fausse manip ?...).
Il manque le C et le D

Le C preg_replace('#&([a-z])(?:acute|grave|u
ne chageait rien

Le D preg_replace("/([^a-z0-9]+)/", "."
donnait a peu près ce que tu attendais

Avatar
kurtz le pirate
In article ,
paul wrote:

OK. Autant pour moi.



<http://www.academie-francaise.fr/langue/questions.html#au_temps> :))

--
klp

Avatar
Olivier Miakinen

Mais alors que faire ?


Voici une proposition, non testée.

function getRewriteString($string) {
/*
* Première étape : on supprime les accents et cédilles des
* lettres accentuées pour les ramener dans la table ASCII.
* On convertit aussi les ligatures Æ, æ, ¼, ½ et ß en leurs
* équivalents à deux lettres.
*/
$conversions = array(
/*
* Tous les caractères suivants sont dans Latin9 et bien sûr
* dans UTF-8. Si vous êtes en Latin1, retirer les caractères
* suivants : ¦¨´¸¼½¾ (dans les commentaires aussi).
* Inversement, en UTF-8 vous pouvez ajouter d'autres
* caractères à cette liste.
*/
"À"=>"A", "Á"=>"A", "Â"=>"A", "Ã"=>"A", "Ä"=>"A", "Å"=>"A",
"à"=>"a", "á"=>"a", "â"=>"a", "ã"=>"a", "ä"=>"a", "å"=>"a",
"Æ"=>"AE", "æ"=>"ae",
"Ç"=>"C", "ç"=>"c",
"È"=>"E", "É"=>"E", "Ê"=>"E", "Ë"=>"E",
"è"=>"e", "é"=>"e", "ê"=>"e", "ë"=>"e",
"Ì"=>"I", "Í"=>"I", "Î"=>"I", "Ï"=>"I",
"ì"=>"i", "í"=>"i", "î"=>"i", "ï"=>"i",
"Ñ"=>"N", "ñ"=>"n",
"Ò"=>"O", "Ó"=>"O", "Ô"=>"O", "Õ"=>"O", "Ö"=>"O",
"ò"=>"o", "ó"=>"o", "ô"=>"o", "õ"=>"o", "ö"=>"o",
"¼"=>"OE", "½"=>"oe",
"¦"=>"S", "¨"=>"s", "ß"=>"ss",
"Ù"=>"U", "Ú"=>"U", "Û"=>"U", "Ü"=>"U",
"ù"=>"u", "ú"=>"u", "û"=>"u", "ü"=>"u",
"Ý"=>"Y", "¾"=>"Y",
"ý"=>"y", "ÿ"=>"y",
"´"=>"Z", "¸"=>"z"
);
$string = strtr($string, $conversions);

/*
* Deuxième étape : tout caractère qui n'est pas une lettre, un
* chiffre, le point (.), le trait d'union (-) ou le blanc souligné
* (_) est remplacé par un blanc souligné.
* Attention : supprimer l'option « u » si vous n'êtes pas en
* UTF-8. Si vous supprimez cette option tout en restant en UTF-8,
* les caractères non ASCII seront remplacés par plusieurs « _ »
* au lieu d'un seul par caractère.
*/
$string = preg_replace("/[^A-Za-z0-9_.-]/u", "_", $string);

return $string;
}

Avatar
paul
In article <45a552a3$,
Olivier Miakinen <om+ wrote:


Mais alors que faire ?


Voici une proposition, non testée.


Merci Olivier.
Ça fonctionne :

ÇaCoÛteZéro¤Piece.jpg
devient
CaCouteZero_Piece.jpg



Entre-temps puisque je ne peux pas utiliser iconv sur mon hébergement,
j'avais essayé d'encadrer ma fonction par:

$string = mb_convert_encoding($sString,"UTF-8","ISO-8859-1");
(...)
$string = mb_convert_encoding($string,"ISO-8859-1","UTF-8");

Mais sans résultat...


Avatar
paul
In article ,
kurtz le pirate wrote:

In article ,
paul wrote:

OK. Autant pour moi.



<http://www.academie-francaise.fr/langue/questions.html#au_temps> :))


Alors là... au temps pour moi !

;-)

Merci !


Avatar
Olivier Miakinen

Merci Olivier.
Ça fonctionne :

ÇaCoÛteZéro¤Piece.jpg
devient
CaCouteZero_Piece.jpg


Génial ! (je suppose que tu avais un û au lieu d'un Û)

Entre-temps puisque je ne peux pas utiliser iconv sur mon hébergement,
j'avais essayé d'encadrer ma fonction par:

$string = mb_convert_encoding($sString,"UTF-8","ISO-8859-1");
(...)
$string = mb_convert_encoding($string,"ISO-8859-1","UTF-8");

Mais sans résultat...


Peut-être parce que tu avais au moins un caractère qui ne fait pas
partie de ISO-8859-1. Ah non, déjà c'est parce que tu as inversé les
paramètres to_encoding et from_encoding. Cela dit, en lisant les
commentaires accompagnant cette fonction je vois que tu aurais pu
essayer « mb_convert_encoding($string,"HTML-ENTITIES","UTF-8") »
suivi de ton preg_replace sur les entités -- mais ç'aurait été plus
compliqué.

Au passage, puisque à la fin du traitement il ne reste que de l'ASCII,
retransformer en UTF-8 ne sert à rien (tout ce qui est de l'ASCII se
retrouve automatiquement valide en ISO-8859-* et en UTF-8).

1 2 3 4 5