Page 1 sur 2
[Upload] Ne retourne pas d'erreur
Posté : 08 mai 2006, 10:20
par agité
J'ai repris le script du tuto pour l'upload de fichier qui est très bien fait mais quand je rentre un fichier qui depasse la taille ou qui n'a pas la bonne extension il ne me le copie pas sur le disque mais ne m'indique pas d'erreur.
J'ai tester avec pas mal de choses mais je bloque la dessus :
<?php
require ("connect.php");
if(isset($_FILES['photo']))
{
unset($erreur);
// On definit les extensions
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg');
$taille_max = 500000;
// On verrifie les extensions
if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
{
$erreur = header("location : chavatar.php?erreur1&PHPSESSID=".$_POST['session']);
}
// On verrifie la taille du fichier
elseif( file_exists($_FILES['photo']['name']) and filesize($_FILES['photo']['name']) > $taille_max)
{
$erreur = header("location : chavatar.php?erreur2&PHPSESSID=".$_POST['session']);
}
// Si ficher = bonne taille & bonne extension
if(!isset($erreur))
{
$dest_dossier = 'c:/www/Avatars/';
$dest_fichier = basename($_FILES['photo']['name']);
$dest_fichier = strtr($dest_fichier,
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
// On upload le fichier
move_uploaded_file($_FILES['photo']['name'], $dest_dossier . $dest_fichier);
header("location: chavatar.php?1&PHPSESSID=".$_POST['session']);
// On remet a jour la base de donnée
$valide = "UPDATE `art` SET avatar = '".$_FILES['photo']['name']."' WHERE nom = '".$_POST['pseudo']."' ";
$test = mysql_query($valide) or die("erreur ! ".mysql_error());
}
}else{
echo"chavatar.php?erreur2&PHPSESSID=".$_POST['session'];
}
?>
Posté : 08 mai 2006, 10:37
par Ryle
As-tu vérifié en plaçant des echo dans les différentes conditions que le script y passait bien ?
D'après ce que tu en comprends, comment le script doit il réagir s'il y a une erreur de taille ou d'extension ? (En gros, que t'attends tu à le voir faire ?)
Posté : 08 mai 2006, 10:40
par agité
a renvoyer sur mon autre page avec le chavatar.php?erreur1 ou 2 ou 3 et dans mon autre script j'indique justement a quoi correspond l'erreur :
<?php
if(isset($_GET['erreur1'])){
echo "Format de fichier non supporté";
}
if(isset($_GET['erreur2'])){
echo "Taille du fichier trop importante";
}
?>
Posté : 08 mai 2006, 10:49
par Ryle
Et qu'est ce qui ne fonctionne pas ? tu n'es pas renvoyé sur l'autre page ? tu es bien renvoyé mais la variable n'est pas définie ?
as-tu placé des echo dans les if in_array et filesize pour vérifier qu'il rentrait bien dedans ?
Posté : 08 mai 2006, 10:52
par agité
Je suis de toute facon bien redirigé sur l'autre page mais le gros soucis c'est qu'il me met l'URL comme si c'etait bon alors que ca ne copie pas le fichier puisque le format n'est pas bon.
Je ne comprends pas ce que tu veux dire par mettre des echo dans les valeurs j'ai tester et il me retourne bien 500000 pour la taille

Posté : 08 mai 2006, 10:56
par Ryle
Pour les echos je pensais simplement faire afficher un bout de texte pour vérifier que le script passait bien là ou il fallait :
if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
{
// par exemple ici, juste ajouter :
echo "Extension non autorisé";
$erreur = header("location : chavatar.php?erreur1&PHPSESSID=".$_POST['session']);
}
S'il rentre bien là, tu verras apparaitre le message (ainsi qu'un warning te disant que le header a déjà été envoyé puisque tu as écrit avant, mais ca c'est pas grave, c'est pour le suivre

)
Ce que tu peux déjà faire c'est virer le "$erreur =", la fonction header est de type "void" cela veut dire qu'elle ne retourne rien, tu ne peux donc rien récuperer dans $erreur

Posté : 08 mai 2006, 10:59
par agité
Quand je met le echo ca me retourne le "extension non supporté" mais ca m'indique aussi une erreur de header qui me reviens souvent !!
Code : Tout sélectionner
Warning: Cannot modify header information - headers already sent by (output started at C:\www\vavatar.php:11) in C:\www\vavatar.php on line 18
Warning: Cannot modify header information - headers already sent by (output started at C:\www\vavatar.php:11) in C:\www\vavatar.php on line 46
Donc en fait il ne test pas la valeur $erreur ? qu'est ce que je peux faire pour maintenir la redirection avec erreur ?
Posté : 08 mai 2006, 11:41
par Ryle
Pour le warning, c'est normal, il t'indique simplement que tu as déjà envoyé du code à l'écran (en l'occurence par le echo) et qu'il ne peut donc pas faire la redirection du header.
Ce que tu peux faire, c'est déjà retirer le "$erreur =" qui ne sert à rien (s'il y a une erreur de toute façon tu rediriges vers un autre script, donc pas besoin de récupérer quoi que ce soit d'autre sur celui ci

)
et ajouter un exit() juste après le header pour qu'il n'aille pas plus loin dans le code, vu que ca ne sert à rien. Essaye comme ceci :
if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) ) {
header("location : chavatar.php?erreur1&PHPSESSID=".$_POST['session']); // pas de valeur retournée, juste le changement de page
exit(); // on arrête le script ici
}
...
et de meme pour la taille...
Posté : 08 mai 2006, 11:44
par agité
c'est que par la suite il test si la variable $erreur a été rentré pour proceder a la fin du script donc il faut bien definir ce $erreur quelque pars :
if(!isset($erreur))
{
donc si erreur n'est pas trouvé on passe a la suite mais la non ca ne marche pas.
J'ai tester avec :
if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
{
// par exemple ici, juste ajouter :
header("location : chavatar.php?erreur1&PHPSESSID=".$_POST['session']);
exit();
}
Il me bloque le script je n'ai rien dans la source et je ne vois pas quoi faire.
En tout cas merci pour ton aide
Posté : 08 mai 2006, 11:53
par Ryle
Le truc c'est que si une erreur est trouvée, le header te renvoi sur une autre page, donc il n'arrivera jamais au if(isSet($erreur)) ... ca serait vrai si au lieu d'une redirection tu mettais un message dans la variable comme le fait Chile dans un topic un peu plus bas...
Cela dit, j'ai peut être trouvé ce qui ne va pas : dans tes header() vire l'espace entre "Location" et ":" :
header("location: chavatar.php?erreur1&PHPSESSID=".$_POST['session']);
On va bien finir par l'avoir ce satané script !

Posté : 08 mai 2006, 11:58
par agité
ouf !
Effectivement c'etait l'espace en trop qui genais le reste donc maintenant il me retourne bien les fichiers non supportés mais pas le poids maximum je fais encore quelque test pour voir.
Posté : 08 mai 2006, 12:48
par agité
<?php
require ("connect.php");
if(isset($_FILES['photo']))
{
unset($erreur);
// On definit les extensions
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg');
$taille_max = 500000;
// On verrifie les extensions
if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
{
// par exemple ici, juste ajouter :
header("location: chavatar.php?erreur1&PHPSESSID=".$_POST['session']);
echo "erreur";
}
// On verrifie la taille du fichier
if( file_exists($_FILES['photo']['name']) and filesize($_FILES['photo']['name']) > $taille_max)
{
header("location: chavatar.php?erreur2&PHPSESSID=".$_POST['session']);
echo "erreur";
}
// Si ficher = bonne taille & bonne extension
if(!isset($erreur))
{
$dest_dossier = 'c:/www/Avatars/';
$dest_fichier = basename($_FILES['photo']['name']);
$dest_fichier = strtr($dest_fichier,
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
// On upload le fichier
move_uploaded_file($_FILES['photo']['name'], $dest_dossier . $dest_fichier);
header("location: chavatar.php?1&PHPSESSID=".$_POST['session']);
// On remet a jour la base de donnée
$valide = "UPDATE `art` SET avatar = '".$_FILES['photo']['name']."' WHERE nom = '".$_POST['pseudo']."' ";
$test = mysql_query($valide) or die("erreur ! ".mysql_error());
}
}else{
header("location: chavatar.php?erreur1&PHPSESSID=".$_POST['session']);
}
?>
quand le format n'est pas bon ca me retourne bien le message mais quand la taille depasse il me le valide quand même ... je comprends pas d'ou viens l'erreur encore une fois j'ai fais quelque test.
j'ai essayer avec exit() mais le script ne s'arrête pas et le echo je ne peux pas le voir car le header fait la redirection comme si tout allait bien.
Posté : 08 mai 2006, 14:10
par agité
Il ne m'upload plus non plus le fichier sur le repertoire ...
Je peux bien changer la base de donnée lire les images et les modifier mais pas les upload sur mon disque ni regler la taille

Posté : 08 mai 2006, 15:01
par Ryle
Je crois qu'il continue d'exécuter le script jusqu'au bout malgré le header. Le exit devrait te permettre d'éviter ça, sinon à la place de ton echo "erreur", tu peux définir la variable erreur pour être sur qu'il ne rentre pas dans ton if(isSet()) :
header("Location:...");
$error = true;
Une petite remarque sinon, tu as également un header avant ton Update, ce serait mieux d'inverser et de faire l'update en premier et de ne faire le header qu'une fois que tu as terminé..
Posté : 08 mai 2006, 15:06
par agité
non je pense pas car le header pour l'extension marche très bien c'est celui pour la taille qui ne fonctionne pas.
Quand a la base SQL je l'update bien le soucis c'est qu'il ne me copie plus les fichiers dans le repertoire !