Discussion:
Tester la validite du nom d'un fichier uploade ?
(trop ancien pour répondre)
paul
2007-01-04 06:59:53 UTC
Permalink
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
CrazyCat
2007-01-04 09:32:33 UTC
Permalink
Post by paul
if(ereg('[^[:space:]a-zA-Z0-9_.-]{1,}',
$HTTP_POST_FILES["submitfiles"]))
Tout d'abord, $HTTP_POST_FILES est déprécié, il vaut mieux utiliser $_FILES.
Ensuite, le nom du fichier est dans $_FILES['submitfiles']['name'] (un
print_r aurait permit de voir que c'est un tableau)
Et dernièrement, la regexp pourrait être: [\w\.\-]{1,}

voila, bon courage
--
Discussions et débats sur l'actualité: http://www.sujets-d-actu.eu
paul
2007-01-04 14:41:22 UTC
Permalink
Post by CrazyCat
Post by paul
if(ereg('[^[:space:]a-zA-Z0-9_.-]{1,}',
$HTTP_POST_FILES["submitfiles"]))
Tout d'abord, $HTTP_POST_FILES est déprécié, il vaut mieux utiliser $_FILES.
Ensuite, le nom du fichier est dans $_FILES['submitfiles']['name'] (un
print_r aurait permit de voir que c'est un tableau)
Et dernièrement, la regexp pourrait être: [\w\.\-]{1,}
Merci pour ta réponse.

J'ai mis :

if(ereg('[\w\.\-]{1,}', $_FILES['submitfiles']['name']))
{
die ("blah blah");
}
else
{
include ("upload.php");
}


Mais ça ne fonctionne toujours pas (je ne rentre jamais dans le if...)
Pourquoi ça ?
Post by CrazyCat
voila, bon courage
Oui j'en au besoin...
;-)
P'tit Marcel
2007-01-04 15:39:04 UTC
Permalink
Post by paul
Post by CrazyCat
Post by paul
je voudrais vérifier la validité du nom d'un fichier photo uploadé (pas
de caractère accentué, d'espace,...).
Et dernièrement, la regexp pourrait être: [\w\.\-]{1,}
Merci pour ta réponse.
if(ereg('[\w\.\-]{1,}', $_FILES['submitfiles']['name']))
{
die ("blah blah");
Mais ça ne fonctionne toujours pas (je ne rentre jamais dans le if...)
Je pense que le masque de CrazyCat n'est pas idéal :
- on n'échappe pas le . et le - dans un masque
- \w *peut* autoriser les caractères accentués
- accessoirement le {1,} est superflu

Donc il faudrait plutôt :

if(eregi('[^-a-z0-9._]', $_FILES['submitfiles']['name'])) {
die(blablabla);
}

ou mieux :
if(preg_match('`[^-a-z0-9._]`i', $_FILES['submitfiles']['name'])) {
die(blablabla);
}


Le masque signifie qu'un caractère au moins ne fait partie :
NI des caractères compris entre a et z (minuscule ou majuscule)
NI des chiffres entre 0 et 9
NI des caractères . _


Accessoirement, vérifie que $_FILES['submitfiles']['name'] contient bien
ce que tu crois (print_r est ton amie, mais ça Olivier te l'avais déjà
soufflé).


eça
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/
CrazyCat
2007-01-04 17:28:54 UTC
Permalink
Tu ne t'avances pas trop, je me bat chaque fois que je fais une regexp :)
Post by P'tit Marcel
- on n'échappe pas le . et le - dans un masque
Je ne crois pas que ce soit une faute non plus (je peux me tromper) et
je dirais même que je suis étonné pour le -
Post by P'tit Marcel
- \w *peut* autoriser les caractères accentués
j'apprend...
Post by P'tit Marcel
- accessoirement le {1,} est superflu
oui, effectivement, c'est un masque...
Post by P'tit Marcel
if(preg_match('`[^-a-z0-9._]`i', $_FILES['submitfiles']['name'])) {
Effectivement, il vaut souvent mieux chercher l'erreur que la bonne réponse.
--
Discussions et débats sur l'actualité: http://www.sujets-d-actu.eu
paul
2007-01-04 17:28:54 UTC
Permalink
Post by P'tit Marcel
if(preg_match('`[^-a-z0-9._]`i', $_FILES['submitfiles']['name'])) {
die(blablabla);
}
NI des caractères compris entre a et z (minuscule ou majuscule)
NI des chiffres entre 0 et 9
NI des caractères . _
Oui c'est bien ce qu'il me faut
Post by P'tit Marcel
Accessoirement, vérifie que $_FILES['submitfiles']['name'] contient bien
ce que tu crois (print_r est ton amie, mais ça Olivier te l'avais déjà
soufflé)
Merci à vous 2

La situation se débloque !
;-)
paul
2007-01-07 01:08:37 UTC
Permalink
Post by paul
Post by P'tit Marcel
Accessoirement, vérifie que $_FILES['submitfiles']['name'] contient bien
ce que tu crois (print_r est ton amie, mais ça Olivier te l'avais déjà
soufflé)
Merci à vous 2
La situation se débloque !
;-)
Argh... j'ai parlé trop vite :

je me suis rendu compte que je rentre toujours dans ce if :
if (!empty($_FILES["submitfiles"])) {

même quand aucun fichier n'a été choisi dans ce input :
print '<input type="file" name="submitfiles" size="50"><p>'."\n";


Qu'est-ce qui se passe ?

Merci
Paul
Fulax
2007-01-08 16:18:19 UTC
Permalink
Post by paul
Post by P'tit Marcel
if(preg_match('`[^-a-z0-9._]`i', $_FILES['submitfiles']['name'])) {
die(blablabla);
}
NI des caractères compris entre a et z (minuscule ou majuscule)
NI des chiffres entre 0 et 9
NI des caractères . _
Oui c'est bien ce qu'il me faut
Pour les regex, il vaut mieux un masque qui reconnait ce que vous
voulez que l'inverse (trouver l'inverse d'un langage régulier n'est
jamais très aisé)

Il te faut donc un nom de fichier qui ne contient que des lettres avec
accents ou non à ce que j'ai lu, des chiffres et les caractères
point, souligné et le tiret

ce qui donne, en inversant les clause if et else :

if (preg_match("/^[-\w.]+$/", $_FILES['submitfiles']['name'])) {
// Ici le nom vérifie de façon certaine les conditions requises si
php est dans la configuration français (cf lien 1)
} else die();...

Une alternative si on ne sait pas dans quelle configuration on est,
c'est de tester la ligne suivant :
var_dump(preg_match("/^\w$/", "é")); // si on a bien true, c'est que
c'est bon


Sinon, si tu utilises PHP >= 4.4.0 ou 5.1.0 on peut utiliser les
classes Unicode de la libpcre

Dans ce cas, l'ensemble des combinaisons de caractères unicode qui
forment une lettre accentuée ou non, dans n'importe quel alphabet, se
résume en \pL et la classe des nombres \pN

la regex devient alors /^[-._\pL\pN]+$/


En espérant avoir pu t'aider


Lien 1 : http://fr.php.net/manual/fr/reference.pcre.pattern.syntax.php
Olivier Miakinen
2007-01-08 16:38:58 UTC
Permalink
Post by Fulax
Pour les regex, il vaut mieux un masque qui reconnait ce que vous
voulez que l'inverse (trouver l'inverse d'un langage régulier n'est
jamais très aisé)
Oui.
Post by Fulax
Il te faut donc un nom de fichier qui ne contient que des lettres avec
accents ou non à ce que j'ai lu, des chiffres et les caractères
point, souligné et le tiret
Oui aussi.
Post by Fulax
if (preg_match("/^[-\w.]+$/", $_FILES['submitfiles']['name'])) {
// Ici le nom vérifie de façon certaine les conditions requises si
php est dans la configuration français (cf lien 1)
} else die();...
Oui, sauf que \w trouvera éventuellement les lettres accentuées, mais
seulement si les deux conditions suivantes sont réalisées simultanément.

1) La locale pour preg_match() correspond par exemple au français,
ce qui n'est pas le cas par défaut (locale C), et je ne sais même
pas si on peut la changer dans PHP.

2) Le charset correspondant à cette locale est une table de caractères
mono-byte, or là on est sûr que ce n'est pas le cas (Paul est en
UTF-8).

Donc, \w ne peut pas marcher.
Post by Fulax
Une alternative si on ne sait pas dans quelle configuration on est,
var_dump(preg_match("/^\w$/", "é")); // si on a bien true, c'est que
c'est bon
Ce sera forcément false.
Post by Fulax
Sinon, si tu utilises PHP >= 4.4.0 ou 5.1.0 on peut utiliser les
classes Unicode de la libpcre
Dans ce cas, l'ensemble des combinaisons de caractères unicode qui
forment une lettre accentuée ou non, dans n'importe quel alphabet, se
résume en \pL et la classe des nombres \pN
la regex devient alors /^[-._\pL\pN]+$/
Oui.
Olivier Miakinen
2007-01-08 16:49:58 UTC
Permalink
Post by Fulax
la regex devient alors /^[-._\pL\pN]+$/
Oui.
Euh... non.

C'est /^[-._\pL\pN]+$/u
Bruno Desthuilliers
2007-01-11 23:15:30 UTC
Permalink
Post by Olivier Miakinen
Post by Fulax
la regex devient alors /^[-._\pL\pN]+$/
Oui.
Euh... non.
C'est /^[-._\pL\pN]+$/u
A tes souhaits !-)
kurtz le pirate
2007-01-05 22:31:42 UTC
Permalink
Post by paul
Bonjour,
je voudrais vérifier la validité du nom d'un fichier photo uploadé (pas
de caractère accentué, d'espace,...).
ha ? une nom de fichier avec des espaces et/ou des caractères accentués
n'est pas un nom valide ? suivant quels critères détermines-tu cela ?
--
klp
paul
2007-01-05 23:38:16 UTC
Permalink
Post by kurtz le pirate
Post by paul
je voudrais vérifier la validité du nom d'un fichier photo uploadé (pas
de caractère accentué, d'espace,...).
ha ? une nom de fichier avec des espaces et/ou des caractères accentués
n'est pas un nom valide ? suivant quels critères détermines-tu cela ?
En fait j'ai eu un souci lors de l'upload d'un fichier image avec un
espace dans son nom. ImageMagick qui s'occupe normalement du resize
automatique là ne s'en occupait plus pour cette raison...
Et comme l'utilisateur avait uploadé une image 300dpi, elle n'a pas été
passée en 72dpi non plus. Pas jolie la mise en page finale !
:-(

C'est vrai que j'ai radicalisé la solution sans avoir testé tous les cas
de figure qui créent ce souci avec imageMagick...
Surfoo
2007-01-06 13:54:27 UTC
Permalink
Post by paul
Post by kurtz le pirate
Post by paul
je voudrais vérifier la validité du nom d'un fichier photo uploadé (pas
de caractère accentué, d'espace,...).
ha ? une nom de fichier avec des espaces et/ou des caractères accentués
n'est pas un nom valide ? suivant quels critères détermines-tu cela ?
En fait j'ai eu un souci lors de l'upload d'un fichier image avec un
espace dans son nom. ImageMagick qui s'occupe normalement du resize
automatique là ne s'en occupait plus pour cette raison...
Et comme l'utilisateur avait uploadé une image 300dpi, elle n'a pas été
passée en 72dpi non plus. Pas jolie la mise en page finale !
:-(
C'est vrai que j'ai radicalisé la solution sans avoir testé tous les cas
de figure qui créent ce souci avec imageMagick...
En mettant le nom de fichier entre " ", ça devrait fonctionner. S'ils
n'y sont pas, imagemagick croit que se sont d'autre paramètres qui sont
passé, donc forcément ça bug. Enfin c'est comme ça dans les chemins
absolus sous Linux.
paul
2007-01-07 01:08:37 UTC
Permalink
Post by Surfoo
Post by paul
C'est vrai que j'ai radicalisé la solution sans avoir testé tous les cas
de figure qui créent ce souci avec imageMagick...
En mettant le nom de fichier entre " ", ça devrait fonctionner. S'ils
n'y sont pas, imagemagick croit que se sont d'autre paramètres qui sont
passé, donc forcément ça bug. Enfin c'est comme ça dans les chemins
absolus sous Linux.
J'ai essayé de mettre (mais j'ai sans doute mal compris...) :

$tmpfile = "$submitfiles['tmp_name']";
$photo = "$submitfiles['name']"

Et j'obtiens :

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE,
expecting T_STRING or T_VARIABLE or T_NUM_STRING in
/home.2/v/e/u/veu/www/upload.php on line 12

Le whitespace c'est celui que j'ai mis dans le nom du fichier pour
tester.
Olivier Miakinen
2007-01-07 01:17:26 UTC
Permalink
Post by paul
$tmpfile = "$submitfiles['tmp_name']";
$photo = "$submitfiles['name']"
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE,
expecting T_STRING or T_VARIABLE or T_NUM_STRING in
/home.2/v/e/u/veu/www/upload.php on line 12
RTFM ?
http://www.php.net/manual/fr/language.types.string.php

Incorrect :
$tmpfile = "$submitfiles['tmp_name']";

Corrects :
$tmpfile = $submitfiles['tmp_name'];
$tmpfile = $submitfiles["tmp_name"];
$tmpfile = "$submitfiles[tmp_name]";
$tmpfile = "{$submitfiles['tmp_name']}";
paul
2007-01-07 19:56:56 UTC
Permalink
Post by paul
$tmpfile = "$submitfiles['tmp_name']";
OK
Post by paul
$tmpfile = $submitfiles['tmp_name'];
Correct oui, mais ImageMagick m'avait fait des misères s'il y a un
espace dans le nom du fichier

J'ai essayé 3 les autres possibilités avec un nom de fichier :
A<- >'Moreil.jpg
ça ne plante pas mais la photo n'est pas traitée. Pas de message
d'erreur.
Post by paul
$tmpfile = $submitfiles["tmp_name"];
$tmpfile = "$submitfiles[tmp_name]";
$tmpfile = "{$submitfiles['tmp_name']}";
Par ailleurs j'ai essayé de passer un fichier avec "seulement' des
caractères accentués : ça passe, l'image est traitée normalement.

Comment écrire le masque pour que les caractères accentués soient
possibles mais pas les espaces, apostrophes, <, >, etc ?...

Actuellement j'ai :
elseif(preg_match('`[^-a-z0-9._]`i', $_FILES['submitfiles']['name']))

Merci
Paul
Olivier Miakinen
2007-01-07 23:01:41 UTC
Permalink
Post by paul
Post by paul
$tmpfile = "$submitfiles['tmp_name']";
OK
Post by paul
$tmpfile = $submitfiles['tmp_name'];
Correct oui, mais ImageMagick m'avait fait des misères s'il y a un
espace dans le nom du fichier
D'accord, mais ça c'est indépendant de la syntaxe pour insérer un
élément de tableau dans une chaîne. Si tu veux rajouter des guillemets
au début et à la fin, tu peux faire par exemple :

$tmpfile = '"' . $submitfiles['tmp_name'] . '"';

Autres exemples :

$tmpfile = "\"$submitfiles[tmp_name]\"";
$tmpfile = "\"{$submitfiles['tmp_name']}\"";

Cela dit, je ne connais pas ImageMagick, et je ne sais donc pas comment
on y accède.
Post by paul
Par ailleurs j'ai essayé de passer un fichier avec "seulement' des
caractères accentués : ça passe, l'image est traitée normalement.
Comment écrire le masque pour que les caractères accentués soient
possibles mais pas les espaces, apostrophes, <, >, etc ?...
elseif(preg_match('`[^-a-z0-9._]`i', $_FILES['submitfiles']['name']))
Ce test devrait réussir s'il existe au moins un caractère qui ne soit
pas un -, une lettre minuscule (ou majuscule d'après le i), un chiffre,
un point ou un blanc souligné. Pour être sûr que cela fait bien ça,
j'aurais mis le - à la fin plutôt qu'après le ^, et A-Z au lieu du
flag i : '`[^A-Za-z0-9._-]`'. Je suppose bien entendu que ce elseif
retourne une erreur dans le cas où le test réussit.

Pour ce qui est des caractères accentués, je ne peux pas te répondre
sans savoir dans quel charset est stocké ton fichier PHP.
paul
2007-01-08 10:12:10 UTC
Permalink
Post by Olivier Miakinen
$tmpfile = '"' . $submitfiles['tmp_name'] . '"';
Malheureusement, je n'y arrive pas mieux actuellement...

Warning: getimagesize("/tmp/phpifBlH9") [function.getimagesize]: failed
to open stream: No such file or directory in
/home.2/v/e/u/veu/www/upload.php on line 91

Warning: Division by zero in /home.2/v/e/u/veu/www/upload.php on line 92

Warning: copy("/tmp/phpifBlH9") [function.copy]: failed to open stream:
No such file or directory in /home.2/v/e/u/veu/www/upload.php



Mais je crois que je vais me plutôt me recentrer sur le masque, ou
peut-être mieux sur un eregi_replace des caractères posant un souci dans
le nom du fichier (espace, apostrophe, etc...).
Post by Olivier Miakinen
Post by paul
elseif(preg_match('`[^-a-z0-9._]`i', $_FILES['submitfiles']['name']))
Ce test devrait réussir s'il existe au moins un caractère qui ne soit
pas un -, une lettre minuscule (ou majuscule d'après le i), un chiffre,
un point ou un blanc souligné. Pour être sûr que cela fait bien ça,
j'aurais mis le - à la fin plutôt qu'après le ^, et A-Z au lieu du
flag i : '`[^A-Za-z0-9._-]`'.
OK je te suis
Post by Olivier Miakinen
Je suppose bien entendu que ce elseif
retourne une erreur dans le cas où le test réussit.
Oui !
Post by Olivier Miakinen
Pour ce qui est des caractères accentués, je ne peux pas te répondre
sans savoir dans quel charset est stocké ton fichier PHP.
Je suis en UTF-8


Merci
Paul
Olivier Miakinen
2007-01-08 14:10:28 UTC
Permalink
Post by paul
Post by Olivier Miakinen
$tmpfile = '"' . $submitfiles['tmp_name'] . '"';
Malheureusement, je n'y arrive pas mieux actuellement...
Warning: getimagesize("/tmp/phpifBlH9") [function.getimagesize]: failed
to open stream: No such file or directory in
/home.2/v/e/u/veu/www/upload.php on line 91
Ah ben oui, si tu as besoin de ce nom de fichier ailleurs que dans
ImageMagick qui semble avoir besoin des guillemets, tu ne dois pas
rajouter les guillemets trop tôt !

$tmpfile = $submitfiles['tmp_name'];
$pourImageMagick = '"' . $tmpfile . '"';

getimagesize($tmpfile);
MachinTrucImageMagick($pourImageMagick);

Et si tu nous montrais un peu plus de ton script ?
Post by paul
Post by Olivier Miakinen
Pour ce qui est des caractères accentués, je ne peux pas te répondre
sans savoir dans quel charset est stocké ton fichier PHP.
Je suis en UTF-8
Alors je vais me renseigner un peu plus sur l'utilisation de PCRE en
UTF-8 avant de te répondre.
Olivier Miakinen
2007-01-08 16:38:58 UTC
Permalink
Post by Olivier Miakinen
Post by paul
Post by Olivier Miakinen
Pour ce qui est des caractères accentués, je ne peux pas te répondre
sans savoir dans quel charset est stocké ton fichier PHP.
Je suis en UTF-8
Alors je vais me renseigner un peu plus sur l'utilisation de PCRE en
UTF-8 avant de te répondre.
Tu as actuellement :
elseif (preg_match('`[^-a-z0-9._]`i', $filename))

Je te proposais :
elseif (preg_match('`[^A-Za-z0-9._-]`', $filename))

Si j'ai bien compris la doc, ceci devrait accepter tout caractère
Unicode compris entre U+00C0 et U+00FF, ce qui inclut la plupart des
caractères accentués utilisés dans certaines langues dont le français,
et aussi quelques autres caractères (× et ÷ par exemple) mais pas les
ligatures œ et Œ :
elseif (preg_match('`[^A-Za-z0-9._\x{C0}-\x{FF}-]`u', $filename))
(bien noter le flag u)

Attention : pour rejeter les séquences UTF-8 mal formées, il vaudrait
peut-être mieux inverser le sens du test, avec un preg_match qui réussit
lorsque la chaîne est correcte, plutôt que l'inverse :
elseif (preg_match('`^[A-Za-z0-9._\x{C0}-\x{FF}-]+$`u', $filename))

Maintenant, si ta version de PHP est au moins la 4.4.0 ou la 5.1.0, tu
dois pouvoir accepter les lettres par \p{L} et les chiffres par \p{N}
mais je ne sais pas si c'est possible dans un []. Si oui :
elseif (preg_match('`^[\p{L}\p{N}._-]+$`u', $filename))

Sinon :
elseif (preg_match('`^(\p{L}|\p{N}|[._-])+$`u', $filename))



Références :
http://fr3.php.net/manual/fr/reference.pcre.pattern.modifiers.php
http://fr3.php.net/manual/fr/reference.pcre.pattern.syntax.php
http://www.pcre.org/

Cordialement,
--
Olivier Miakinen
paul
2007-01-09 09:52:51 UTC
Permalink
Post by Olivier Miakinen
Ah ben oui, si tu as besoin de ce nom de fichier ailleurs que dans
ImageMagick qui semble avoir besoin des guillemets, tu ne dois pas
rajouter les guillemets trop tôt !
Oui effectivement !
Je n'ai plus modifié que le "name" car que je me suis rendu compte que
le "tmp_name" était généré automatiquement et n'avait à priori pas de
rapport avec le nom du fichier saisi dans le champ input... donc à
priori pas de pb de ce côté-là.

J'ai réessayé les différentes solutions évoquées :

:
- le fichier n'est pas resizé.
- les variables passées ensuite dans l'URL PHP n'aiment pas du tout ces
caractères (apostrophes...) : les noms de fichier sont tronqués après le
antislash placés automatiquement devant les apostrophes...

:-((

Je crois qu'il faut vraiment faire la modification du nom de fichier..
Post by Olivier Miakinen
Et si tu nous montrais un peu plus de ton script ?
Oui !
Post by Olivier Miakinen
Post by paul
Post by Olivier Miakinen
Pour ce qui est des caractères accentués, je ne peux pas te répondre
sans savoir dans quel charset est stocké ton fichier PHP.
Je suis en UTF-8
Alors je vais me renseigner un peu plus sur l'utilisation de PCRE en
UTF-8 avant de te répondre.
Plutôt qu'un masque qui m'oblige ensuite à demander à l'utilisateur de
renommer son fichier, je préfère le renommer directement :



$submitfiles = $_FILES["submitfiles"];

function getRewriteString($sString) {
$string = htmlentities(strtolower($sString));
$string =
preg_replace('#&([a-z])(?:acute|grave|uml|circ|ring|slash|zlig|cedil|tild
e);#i', "$1", $string);
//$string =
preg_replace("/&(.)(acute|cedil|circ|ring|tilde|uml);/", "$1", $string);
$string = preg_replace("/([^a-z0-9]+)/", ".",
html_entity_decode($string));
$string = trim($string, "");
return $string;
}

$tmpfile = $submitfiles['tmp_name'];
$photo = getRewriteString($submitfiles['name']);


Là il se passe 2 choses :

- aucune des 2 preg_replace qui devraient remplacer les caractères
accentués par leur équivalent non-accentué ne fonctionne...
Je ne sais pas pourquoi.

- je peux me retrouver avec plusieurs point dans le nom de fichier
exemple : .img.e.jpg
Euh ça pose un problème ça ?


Merci
Paul
Olivier Miakinen
2007-01-09 10:57:40 UTC
Permalink
Post by paul
$submitfiles = $_FILES["submitfiles"];
function getRewriteString($sString) {
$string = htmlentities(strtolower($sString));
Attention : htmlentities() est en Latin1 par défaut, tandis que
strtolower(), par défaut, ne traite que les caractères ASCII.
Aucun des deux ne peut fonctionner tel quel en UTF-8.
Post by paul
$string = preg_replace('#&([a-z])(?:acute|grave|uml|circ|ring|slash|zlig|cedil|tilde);#i', "$1", $string);
Rigolo. Je n'y aurais pas pensé !
Post by paul
//$string = preg_replace("/&(.)(acute|cedil|circ|ring|tilde|uml);/", "$1", $string);
$string = preg_replace("/([^a-z0-9]+)/", ".", html_entity_decode($string));
Là encore le charset par défaut pour html_entity_decode() est Latin1 et
pas UTF-8.
Post by paul
$string = trim($string, "");
Euh... il n'y a pas un paramètre en trop, ou des caractères manquants
dans le paramètre ? Là tu dis que tu veux supprimer des caractères en
début et fin de ligne, mais en fait il n'y a aucun caractère que tu veux
supprimer (puisque la liste est vide).
Post by paul
- aucune des 2 preg_replace qui devraient remplacer les caractères
accentués par leur équivalent non-accentué ne fonctionne...
Je ne sais pas pourquoi.
Tu es sûr que ce sont les preg_replace() qui ne fonctionnent pas ? Ce ne
seraient pas plutôt strtolower(), htmlentities(), html_entity_decode()
et trim() ?
Post by paul
- je peux me retrouver avec plusieurs point dans le nom de fichier
exemple : .img.e.jpg
Euh ça pose un problème ça ?
Si tu n'es pas en MS-DOS avec le format « 8 caractères + point + 3
caractères », ça ne devrait pas poser de problème. ;-)
paul
2007-01-09 13:54:40 UTC
Permalink
Post by Olivier Miakinen
Post by paul
$submitfiles = $_FILES["submitfiles"];
function getRewriteString($sString) {
$string = htmlentities(strtolower($sString));
Attention : htmlentities() est en Latin1 par défaut, tandis que
strtolower(), par défaut, ne traite que les caractères ASCII.
Aucun des deux ne peut fonctionner tel quel en UTF-8.
Pourtant toutes mes caps sont changées en minuscules...
Post by Olivier Miakinen
Post by paul
$string =
preg_replace('#&([a-z])(?:acute|grave|uml|circ|ring|slash|zlig|cedil|t
ilde);#i', "$1", $string);
Rigolo. Je n'y aurais pas pensé !
Oui mais ça ne fonctionne pas chez moi
:-(
Post by Olivier Miakinen
Post by paul
//$string = preg_replace("/&(.)(acute|cedil|circ|ring|tilde|uml);/",
"$1", $string);
Celle-ci non plus...

Ces 2 preg_replace liées aux caractères accentués ne fonctionnent pas...
Pourquoi ?
Comme faire fonctionner ça ?

Et en fait les éèà et autres seront remplacés par un . par la
Post by Olivier Miakinen
Post by paul
$string = preg_replace("/([^a-z0-9]+)/", ".",
Celle-ci fonctionne bien donc
Post by Olivier Miakinen
Post by paul
html_entity_decode($string));
Là encore le charset par défaut pour html_entity_decode() est Latin1 et
pas UTF-8.
Post by paul
$string = trim($string, "");
Euh... il n'y a pas un paramètre en trop, ou des caractères manquants
dans le paramètre ? L tu dis que tu veux supprimer des caractères en
début et fin de ligne, mais en fait il n'y a aucun caractère que tu veux
supprimer (puisque la liste est vide).
Si je comprends bien ce qui est dit là
<http://fr2.php.net/manual/fr/function.trim.php>
trim() retourne la chane str, après avoir supprimé les caractères
invisibles en début et fin de chane. Si le second paramètre charlist est
omis, trim() supprimera les caractères suivants :
" " (ASCII 32 (0x20)), un espace ordinaire.
"\t" (ASCII 9 (0x09)), une tabulation.
"\n" (ASCII 10 (0x0A)), une nouvelle ligne (line feed).
"\r" (ASCII 13 (0x0D)), un retour chariot (carriage return).
"\0" (ASCII 0 (0x00)), le caractère NUL.
"\x0B" (ASCII 11 (0x0B)), une tabulation verticale.

S'il y en a, ils sont remplacés par rien, ""
Post by Olivier Miakinen
Post by paul
- aucune des 2 preg_replace qui devraient remplacer les caractères
accentués par leur équivalent non-accentué ne fonctionne...
Je ne sais pas pourquoi.
Tu es sûr que ce sont les preg_replace() qui ne fonctionnent pas ? Ce ne
seraient pas plutôt strtolower(), htmlentities(), html_entity_decode()
et trim() ?
Ben oui
Post by Olivier Miakinen
Post by paul
- je peux me retrouver avec plusieurs point dans le nom de fichier
exemple : .img.e.jpg
Euh ça pose un problème ça ?
Si tu n'es pas en MS-DOS avec le format « 8 caractères + point + 3
caractères », ça ne devrait pas poser de problème. ;-)
Ouf j'ai au moins cette solution en attendant mieux !
:-)
Olivier Miakinen
2007-01-09 15:07:59 UTC
Permalink
Post by paul
Post by Olivier Miakinen
Attention : htmlentities() est en Latin1 par défaut, tandis que
strtolower(), par défaut, ne traite que les caractères ASCII.
Aucun des deux ne peut fonctionner tel quel en UTF-8.
Pourtant toutes mes caps sont changées en minuscules...
Tu es sûr que ton fichier est en UTF-8 ?
Post by paul
Et en fait les éèà et autres seront remplacés par un . par la
Post by Olivier Miakinen
Post by paul
$string = preg_replace("/([^a-z0-9]+)/", ".",
Un seul « . » par caractère accentué ?!? Tu es sûr que ton fichier est
en UTF-8 ?
Post by paul
Post by Olivier Miakinen
Post by paul
$string = trim($string, "");
Euh... il n'y a pas un paramètre en trop, ou des caractères manquants
dans le paramètre ? L tu dis que tu veux supprimer des caractères en
début et fin de ligne, mais en fait il n'y a aucun caractère que tu veux
supprimer (puisque la liste est vide).
Si je comprends bien ce qui est dit là
<http://fr2.php.net/manual/fr/function.trim.php>
trim() retourne la chane str, après avoir supprimé les caractères
invisibles en début et fin de chane.
Hum. « invisible » est une traduction bien curieuse pour « whitespace ».
Post by paul
Si le second paramètre charlist est omis [...]
Voilà. Si le second paramètre est omis, l'appel ressemblera à :
$string = trim($string);

Ce n'est pas ce que tu as écrit :
$string = trim($string, "");
Ici, le second paramètre est fourni, et sa valeur est une chaîne vide.
Elle ne contient donc aucun des caractères « whitespace » (espace, TAB,
CR, LF, NUL et VT).
Post by paul
Post by Olivier Miakinen
Tu es sûr que ce sont les preg_replace() qui ne fonctionnent pas ? Ce ne
seraient pas plutôt strtolower(), htmlentities(), html_entity_decode()
et trim() ?
Ben oui
Alors tu n'es pas en UTF-8, mais peut-être en Latin1 ou en cp1252.
paul
2007-01-09 18:21:19 UTC
Permalink
Post by Olivier Miakinen
Post by paul
Et en fait les éèà et autres seront remplacés par un . par la
Post by Olivier Miakinen
Post by paul
$string = preg_replace("/([^a-z0-9]+)/", ".",
Un seul « . » par caractère accentué ?!?
Non un seul " . " par série consécutive de caractères accentués.

IMéàoerORG_ ' A<>A" eéé .JPG
devient
.im.oerorg.a.a.e.jpg
Post by Olivier Miakinen
Tu es sûr que ton fichier est
en UTF-8 ?
Ben à priori oui :
<meta http-equiv="content-type" content="text/html; charset=utf-8">
Comment s'en assurer autrement ?
Post by Olivier Miakinen
Post by paul
Si je comprends bien ce qui est dit là
<http://fr2.php.net/manual/fr/function.trim.php>
trim() retourne la chane str, après avoir supprimé les caractères
invisibles en début et fin de chane.
Hum. « invisible » est une traduction bien curieuse pour « whitespace ».
;-)
Post by Olivier Miakinen
Post by paul
Si le second paramètre charlist est omis [...]
$string = trim($string);
$string = trim($string, "");
Ici, le second paramètre est fourni, et sa valeur est une chaîne vide.
Elle ne contient donc aucun des caractères « whitespace » (espace, TAB,
CR, LF, NUL et VT).
OK. Autant pour moi.
Post by Olivier Miakinen
Post by paul
Post by Olivier Miakinen
Tu es sûr que ce sont les preg_replace() qui ne fonctionnent pas ? Ce ne
seraient pas plutôt strtolower(), htmlentities(), html_entity_decode()
et trim() ?
Ben oui
Alors tu n'es pas en UTF-8, mais peut-être en Latin1 ou en cp1252.
A l'insu de mon plein gré alors !...
Comment vérifier ça ?
Olivier Miakinen
2007-01-09 19:14:06 UTC
Permalink
Post by paul
Post by Olivier Miakinen
Tu es sûr que ton fichier est
en UTF-8 ?
<meta http-equiv="content-type" content="text/html; charset=utf-8">
Beuah !

Essaye plutôt :
<?php
header("Content-Type", "text/html; charset=utf-8");
?>
Post by paul
Comment s'en assurer autrement ?
File > Save as... > Format
- ISO-8859-1
- Latin 1
- EBCDIC
- UTF-8
- UTF-16 BE
- Unicode
- Windows Western
- Shift_JIS
- ... autre ?

Et puis si tu avais une URL pour tester ce serait bien.
Post by paul
Post by Olivier Miakinen
Alors tu n'es pas en UTF-8, mais peut-être en Latin1 ou en cp1252.
A l'insu de mon plein gré alors !...
Comment vérifier ça ?
Cf. supra.
paul
2007-01-09 21:39:05 UTC
Permalink
Post by Olivier Miakinen
Post by paul
Post by Olivier Miakinen
Tu es sûr que ton fichier est
en UTF-8 ?
<meta http-equiv="content-type" content="text/html; charset=utf-8">
Beuah !
Bon...
Post by Olivier Miakinen
<?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
The server encountered an internal error or misconfiguration and was
unable to complete your request.

C'est grave docteur ?
Post by Olivier Miakinen
Post by paul
Comment s'en assurer autrement ?
File > Save as... > Format
- ISO-8859-1
- Latin 1
- EBCDIC
- UTF-8
- UTF-16 BE
- Unicode
- Windows Western
- Shift_JIS
- ... autre ?
BBEdit me le signale en UTF8 no-BOM
Post by Olivier Miakinen
Et puis si tu avais une URL pour tester ce serait bien.
OK je te fais ça plus tard si on continue à être bloqués...


Merci
Paul
Olivier Miakinen
2007-01-09 21:54:31 UTC
Permalink
Post by paul
Post by Olivier Miakinen
<?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">
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");

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>.
Post by paul
BBEdit me le signale en UTF8 no-BOM
Ça c'est parfait. Je suis convaincu maintenant que c'est bien de
l'UTF-8, même s'il vaut mieux l'annoncer dans les entêtes HTTP comme
je le disais plutôt que dans un élément meta. Note que tu peux toujours
faire les deux, afin qu'un visiteur puisse sauver la page sur son disque
dur et le retrouver en UTF-8 à la relecture.

Je vais revenir sur ton article précédent maintenant.
paul
2007-01-09 22:24:06 UTC
Permalink
Post by Olivier Miakinen
Post by paul
Post by Olivier Miakinen
<?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">
Internal Server Error
J'aurais dû vérifier avant d'envoyer, mais j'étais un peu en retard.
header("Content-Type: text/html; charset=UTF-8");
J'avais modifié après une petite recherche sur Google...
Post by Olivier Miakinen
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
:-(
Post by Olivier Miakinen
Post by paul
BBEdit me le signale en UTF8 no-BOM
Ça c'est parfait.
C'est déjà ça de pris !
Post by Olivier Miakinen
Je vais revenir sur ton article précédent maintenant.
Merci de consacrer du temps à ce problème.

Paul
kurtz le pirate
2007-01-10 20:00:36 UTC
Permalink
Post by paul
OK. Autant pour moi.
<http://www.academie-francaise.fr/langue/questions.html#au_temps> :))
--
klp
paul
2007-01-11 08:53:26 UTC
Permalink
Post by kurtz le pirate
Post by paul
OK. Autant pour moi.
<http://www.academie-francaise.fr/langue/questions.html#au_temps> :))
Alors là... au temps pour moi !

;-)

Merci !
Olivier Miakinen
2007-01-09 22:24:06 UTC
Permalink
Je reviens donc sur cet article.
Post by paul
Post by Olivier Miakinen
Post by paul
$string = htmlentities(strtolower($sString));
Attention : htmlentities() est en Latin1 par défaut, tandis que
strtolower(), par défaut, ne traite que les caractères ASCII.
Aucun des deux ne peut fonctionner tel quel en UTF-8.
Pourtant toutes mes caps sont changées en minuscules...
J'ai d'abord pris ta réponse comme une preuve que tu ne pouvais pas être
en UTF-8, mais je n'ai pas pensé que quand tu disais « toutes mes caps »
il n'y avait peut-être pas de minuscules accentuées dedans.

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
UnŒuf.jpg
ÇaCoûteZéro€Pièce.jpg
Post by paul
Post by Olivier Miakinen
Post by paul
$string =
preg_replace('#&([a-z])(?:acute|grave|uml|circ|ring|slash|zlig|cedil|t
ilde);#i', "$1", $string);
Tu peux aussi continuer et afficher le résultat de ce preg_replace et du
suivant.
Post by paul
Et en fait les éèà et autres seront remplacés par un . par la
Post by Olivier Miakinen
Post by paul
$string = preg_replace("/([^a-z0-9]+)/", ".",
Celle-ci fonctionne bien donc
Je n'avais pas vu le « + » qui explique qu'une série de caractères
accentués deviennent un seul point. Je te propose pour le test de
supprimer ce « + » : si ce que je crois est exact, tu devrais obtenir :
unb..uf.jpg
un..uf.jpg
..aco..tez..ro...pi..ce.jpg
(trois points pour l'€, deux pour chacun des autres caractères accentués)
paul
2007-01-10 07:53:42 UTC
Permalink
Post by Olivier Miakinen
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(),
UnBœuf.jpg
1
Post by Olivier Miakinen
UnŒuf.jpg
2
Post by Olivier Miakinen
Ç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;ì
Olivier Miakinen
2007-01-10 08:28:31 UTC
Permalink
Post by paul
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.
Post by paul
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.
Post by paul
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 Ç.
Post by paul
(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.
paul
2007-01-10 10:17:48 UTC
Permalink
Post by Olivier Miakinen
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 ?
Olivier Miakinen
2007-01-10 20:57:02 UTC
Permalink
Post by paul
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;
}
paul
2007-01-11 08:53:26 UTC
Permalink
Post by Olivier Miakinen
Post by paul
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...
Olivier Miakinen
2007-01-11 11:24:40 UTC
Permalink
Post by paul
Merci Olivier.
ÇaCoÛteZéro€Piece.jpg
devient
CaCouteZero_Piece.jpg
Génial ! (je suppose que tu avais un û au lieu d'un Û)
Post by paul
Entre-temps puisque je ne peux pas utiliser iconv sur mon hébergement,
$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).
paul
2007-01-11 18:23:04 UTC
Permalink
Post by Olivier Miakinen
Post by paul
Merci Olivier.
ÇaCoÛteZéro€Piece.jpg
devient
CaCouteZero_Piece.jpg
Génial ! (je suppose que tu avais un û au lieu d'un Û)
Oui exactement


Ceci dit il m'arrive quelque chose d'étrange :
en continuant à tester, j'ai eu une erreur avec un fichier avec un nom
improbable se terminant par éàç.jpg

Le nom est bien changé en eac.jpg par la fonction, mais ImageMagick ne
traite pas l'image.

J'ai un message m'avertissant qu'une division par 0 n'est pas possible à
ce niveau du code :
list($width, $height) = getimagesize($tmpfile);
$imgratio=$width/$height;

Il trouve 0 pour $height...

Je rappelle que je n'interviens pas sur $tmpfile qui est généré
automatiquement. Je ne modifie que $photo :
$submitfiles = $_FILES["submitfiles"];
$tmpfile = $submitfiles['tmp_name'];
$photo = getRewriteString($submitfiles['name']);{



Mais ce qui est encore plus étrange, comme je suis sur Mac, j'ai testé
depuis un PC en uploadant un fichier éàç.jpg. et là il n'y a aucun
problème...

Que se passe-t-il ?
Olivier Miakinen
2007-01-12 06:34:11 UTC
Permalink
Post by paul
en continuant à tester, j'ai eu une erreur avec un fichier avec un nom
improbable se terminant par éàç.jpg
Le même fichier fonctionne avec un autre nom ?
Un autre fichier plante aussi avec ce même nom ?

En bref : ce n'est pas le contenu du fichier qui fait ça plutôt
que son nom ?
Post by paul
Mais ce qui est encore plus étrange, comme je suis sur Mac, j'ai testé
depuis un PC en uploadant un fichier éàç.jpg. et là il n'y a aucun
problème...
*un* fichier ou *le même* fichier ?
paul
2007-01-12 08:40:01 UTC
Permalink
Post by Olivier Miakinen
Post by paul
en continuant à tester, j'ai eu une erreur avec un fichier avec un nom
improbable se terminant par éàç.jpg
Le même fichier fonctionne avec un autre nom ?
oui
Post by Olivier Miakinen
Un autre fichier plante aussi avec ce même nom ?
oui
Post by Olivier Miakinen
En bref : ce n'est pas le contenu du fichier qui fait ça plutôt
que son nom ?
Exactement
Post by Olivier Miakinen
Post by paul
Mais ce qui est encore plus étrange, comme je suis sur Mac, j'ai testé
depuis un PC en uploadant un fichier éàç.jpg. et là il n'y a aucun
problème...
*un* fichier ou *le même* fichier ?
les 2 :
j'ai renommé un fichier image en éàç.jpg : aucun souci.
Puis j'ai copié le fichier qui plantait sur Mac (via clé USB) sur le PC
puis fait l'upload : aucun souci.

Je ne sais pas si c'est une histoire Mac Pc.
Mais le même nom de fichier fait planter sur un ordinateur et pas sur
l'autre...

paul
2007-01-12 06:34:11 UTC
Permalink
Post by paul
en continuant à tester, j'ai eu une erreur avec un fichier avec un nom
improbable se terminant par éàç.jpg
Le nom est bien changé en eac.jpg par la fonction, mais ImageMagick ne
traite pas l'image.
J'ai un message m'avertissant qu'une division par 0 n'est pas possible à
list($width, $height) = getimagesize($tmpfile);
$imgratio=$width/$height;
Il trouve 0 pour $height...
Je rappelle que je n'interviens pas sur $tmpfile qui est généré
$submitfiles = $_FILES["submitfiles"];
$tmpfile = $submitfiles['tmp_name'];
$photo = getRewriteString($submitfiles['name']);{
Je n'ai peut-être pas été clair, mais ce problème n'a rien à voir avec
la fonction qui renomme le fichier...
:-(
Post by paul
Mais ce qui est encore plus étrange, comme je suis sur Mac, j'ai testé
depuis un PC en uploadant un fichier éàç.jpg. et là il n'y a aucun
problème...
Que se passe-t-il ?
Un codage spécial au Mac sur certains caractères accentués qui
provoquerait la génération d'un mauvais nom de fichier temporaire ?...
A priori pas :

print_r($tmpfile);
me donne le même style nom de : /tmp/php + 6 caractères aplanimériques
en majuscule ou non

Sur Mac avec éàç.jpg (qui ne passe pas) :
/tmp/phpPcUkVU
/tmp/phpMWkggS
/tmp/php9IjWls

Sur PC pas de différence notable dans la structure des noms de fichiers.

Sur Mac avec ÇaCoûteZéro€Pièce.jpg (qui passe) :
/tmp/phptem9V1
/tmp/phpZIOQcI
/tmp/phpDmeBPN
paul
2007-01-10 12:26:44 UTC
Permalink
Post by paul
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
Antoine Polatouche
2007-01-07 23:01:41 UTC
Permalink
Post by paul
Post by paul
$tmpfile = "$submitfiles['tmp_name']";
OK
Post by paul
$tmpfile = $submitfiles['tmp_name'];
Correct oui, mais ImageMagick m'avait fait des misères s'il y a un
espace dans le nom du fichier
A<- >'Moreil.jpg
ça ne plante pas mais la photo n'est pas traitée. Pas de message
d'erreur.
et avec

$tmpfile = '"'.$submitfiles["tmp_name"].'"';

?
paul
2007-01-07 01:09:32 UTC
Permalink
Je poste en aveugle car je ne vois pas le message que j'ai placé il y a
2 heures environ (d'ailleurs il arrive fréquemment qu'il y ait une
demi-journée entre l'envoi du message et sa parution chez moi, sans que
je sache si cela provient de ma config ou de fr.comp.lang.php..)

Bref,
j'ai trouvé pour mon problème de if
j'ai remplacé
if (!empty($_FILES["submitfiles"])) {
par
if (!empty($_FILES["submitfiles"]["name"])) {

et ça va beaucoup mieux !
Désolé pour le bruit.
Continuer la lecture sur narkive:
Loading...