Problème vérification taille image

Eléphant du PHP | 184 Messages

09 déc. 2011, 20:37

Bonjour à vous,

J'ai un bout de code pour controler la taille de l'image avant upload.
J'ai un petit soucis dans le sens où, si la taille dépasse 2Mo ( mon max autorisé ) en envoyant une image de genre 5 Mo j'ai bien le message d'erreur.
Mais si j'envoie une image de 15 Mo par exemple, il ne se passe rien :(

Voilà ce que j'utilise:
	    if ($_FILES['userfile']['error']==1) {
		$msgErreurPhoto .= '<center>'.'<br/>'.'<p style="color:#ff0000;font-weight:bold;">La taille de votre image est trop importante (Maximun: 2Mo)</p>'.'</center>';
		$traiterPhotoOK = 'NON';
		}
		
        if ($_FILES['userfile']['error']==2) {
		$msgErreurPhoto .= '<center>'.'<br/>'.'<p style="color:#ff0000;font-weight:bold;">La taille de votre image est trop importante (Maximun: 2Mo)</p>'.'</center>';
		$traiterPhotoOK = 'NON';
		}
		
		
		if ($_FILES['userfile']['error']==4) {
		$msgErreurPhoto .= '<center>'.'<br/>'.'<p style="color:#ff0000;font-weight:bold;">Vous devez charger une image pour pouvoir continuer</p>'.'</center>';
		$traiterPhotoOK = 'NON';
		}

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

09 déc. 2011, 22:25

Au niveau de la configuration de ton serveur (fichier php.ini), tu peux gérer deux informations :
- le max upload size (soit la taille maximum des fichiers qui peuvent être envoyés - par défaut à 2Mo)
- et le post max size (soit la taille maximum des données qui peuvent être envoyée en post - par défaut à 8Mo).

Si ton fichier fait plus de 2Mo, il ne sera récupéré par le serveur. S'il fait plus de 8Mo, c'est la requête post qui n'arrivera pas et le serveur ne pourra pas traiter la demande :)

Il te faut donc modifier ces deux paramètres si tu veux autoriser l'upload et le traitement de fichiers plus volumineux.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 184 Messages

09 déc. 2011, 23:21

Merci pour la réponse,

Mais je ne veux pas autoriser un plus gros upload, je veux juste faire un contrôle d'erreur pour que si cela dépasse 2Mo, il m'affiche le message.

J'ai bien les bons paramètres dans le php.ini, quand j'envoie un fichier de 5 Mo j'ai bien le message d'erreur, mais sur les très gros ( ex:15mo ) il ne se passe bien.
Il n'upload pas mais ne m'affiche pas de message.

Pourtant je fais le contrôle sur les deux non ?

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

10 déc. 2011, 01:55

tiens une fonction modifier a ma sauce pour ce genre de cas (décrit dans la doc ;) )
function up_error($code,$nom='') {
switch ($code) {
case UPLOAD_ERR_OK : $erreur = 'Pas d'erreur';$valid = true;break;
case UPLOAD_ERR_INI_SIZE : $erreur = 'Votre fichier `'.$nom.'` dépasse la taille maximale d\'upload autorisée par PHP( '.get_cfg_var('upload_max_filesize').' )';$valid = false;break;
case UPLOAD_ERR_FORM_SIZE : $erreur = 'Votre fichier dépasse la taille maximale demandée par le Webmestre';$valid = false;break;
case UPLOAD_ERR_PARTIAL : $erreur = 'Le fichier \n'a été que partiellement téléchargé. !!!';$valid = false;break;
case UPLOAD_ERR_NO_FILE : $erreur = 'Aucun fichier téléchargé !!!';$valid = false;break;
case UPLOAD_ERR_NO_TMP_DIR : $erreur = 'Un dossier temporaire est manquant.'
case UPLOAD_ERR_CANT_WRITE : $erreur = 'Échec de l\'écriture du fichier sur le disque.'
case UPLOAD_ERR_EXTENSION : $erreur = 'Une extension PHP a arrêté l\'envoi de fichier. PHP ne propose aucun moyen de déterminer quelle extension est en cause. L'examen du phpinfo() peut aider.';
default : $erreur = 'L\'upload a rencontré une erreur inconnue !!!';$valid = false; break;
}
 
$return[] = $valid;
$return[] = $erreur;
return $return;
}
$code correspondant à $_FILES['nom du champ']['error']

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 184 Messages

10 déc. 2011, 09:58

J'ai fait ceci mais cela n'a pas marché, il y a quelque chose que j'ai loupé ?

Merci en tout cas pour la réponse.
$code = ($_FILES['userfile']['error']);

function up_error($code,$nom='') {
switch ($code) {
case UPLOAD_ERR_OK : $erreur = 'Pas d erreur';$valid = true;break;
case UPLOAD_ERR_INI_SIZE : $erreur = 'Votre fichier `'.$nom.'` dépasse la taille maximale d\'upload autorisée par PHP( '.get_cfg_var('upload_max_filesize').' )';$valid = false;break;
case UPLOAD_ERR_FORM_SIZE : $erreur = 'Votre fichier dépasse la taille maximale demandée par le Webmestre';$valid = false;break;
case UPLOAD_ERR_PARTIAL : $erreur = 'Le fichier n\'a été que partiellement téléchargé. !!!';$valid = false;break;
case UPLOAD_ERR_NO_FILE : $erreur = 'Aucun fichier téléchargé !!!';$valid = false;break;
case UPLOAD_ERR_NO_TMP_DIR : $erreur = 'Un dossier temporaire est manquant.';
case UPLOAD_ERR_CANT_WRITE : $erreur = 'Échec de l\'écriture du fichier sur le disque.';
case UPLOAD_ERR_EXTENSION : $erreur = 'Une extension PHP a arrêté l\'envoi de fichier. PHP ne propose aucun moyen de déterminer quelle extension est en cause. L\'examen du phpinfo() peut aider.';
default : $erreur = 'L\'upload a rencontré une erreur inconnue !!!';$valid = false; break;
}
}

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

10 déc. 2011, 16:48

oui t'a pas chercher a comprendre le code je pense ?

cette fonction retourne un tableau que tu n'a pas dans ton code.

cette fonction contient l'information de "validation" et si besoin de le message d'erreur.

il te manque
$return[] = $valid;
$return[] = $erreur;
return $return;

si tu fait
$retour = up_error($error,$fichier);
$retour[0] aura pour valeur true / false en fonction du code erreur (true pour un upload ok et false pour le reste) et le message d'erreur qui va bien dans $retour[1] si $retour[0] === false.

c'est pas super pratique, j'ai pu dire soit c'est true soit c'est retour d'erreur mais bon vu que tout le monde utilise le == la comparaison a true aurait toujours fonctionné, même en cas d'erreur (parce que true == 'nimporte quelle chaine de caractère sauf zéro / false' :) )

sinon il aurait fallu un tite objet du style
<?php
class validerror {
	private $error;
	
	public function up_error($code,$nom='') {
		switch ($code) {
		case UPLOAD_ERR_OK : $this->error = 'Pas d\'erreur';$valid = true;break;
		case UPLOAD_ERR_INI_SIZE : $this->error = 'Votre fichier `'.$nom.'` dépasse la taille maximale d\'upload autorisée par PHP( '.get_cfg_var('upload_max_filesize').' )';$valid = false;break;
		case UPLOAD_ERR_FORM_SIZE : $this->error = 'Votre fichier dépasse la taille maximale demandée par le Webmestre';$valid = false;break;
		case UPLOAD_ERR_PARTIAL : $this->error = 'Le fichier n\'a été que partiellement téléchargé. !!!';$valid = false;break;
		case UPLOAD_ERR_NO_FILE : $this->error = 'Aucun fichier téléchargé !!!';$valid = false;break;
		case UPLOAD_ERR_NO_TMP_DIR : $this->error = 'Un dossier temporaire est manquant.'
		case UPLOAD_ERR_CANT_WRITE : $this->error = 'Échec de l\'écriture du fichier sur le disque.'
		case UPLOAD_ERR_EXTENSION : $this->error = 'Une extension PHP a arrété l\'envoi de fichier. PHP ne propose aucun moyen de déterminer quelle extension est en cause. L\'examen du phpinfo() peut aider.';
		default : $this->error = 'L\'upload a rencontré une erreur inconnue !!!';$valid = false; break;
		}
		return $valid;
	}
	
	public function getError(){
		return $this->error;
	}
}
?>
mais a ce niveau la autant faire une classe pour tout l'upload :)


@+
Il en faut peu pour être heureux ......