Bonjour,
J'ai un soucis avec l'upload de fichier en PHP. Je me suis créé un classe d'upload d'image pour faire tous les tests.
Le problème c'est que quand je pose une image plus grosse que la taille autorisée par php.ini (8Mo), le script s'arrête avant même que je puisse faire les test en PHP et afficher l'erreur proprement.
Je ne cherche pas à augmenter la limite upload_max_size ou post_max_size
Le script refuse les images de plus de 2Mo et retourne les bonnes erreurs, mais si l'image uploadée dépasse 8Mo, alors j'obtient cette erreur, et ma page s'affiche mal car le scrip n'a pas eu le temps de générer le contenu :
Warning: POST Content-Length of 9302918 bytes exceeds the limit of 8388608 bytes in Unknown on line 0
Voici mon form HTML (simplifié) :
<form action="<?php echo DOMAIN; ?>user/update/<?php echo SRequest::getInstance()->get('u_id'); ?>" method="POST" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2048576" />
<input type="file" name="u_avatar" value=""/><br/><br/>
</form>
Voici les deux méthodes de test que j'appelle au sein de ma classe :
J'analyse d'abord les erreurs de $_FILES['image']['error']
Puis ensuite je teste la taille de $_FILES['image']['size']
private function file_err(){
$maxsize_Mo = round( $this->maxsize / 1000000 );
switch ($this->image_src['error']){
case 1: // UPLOAD_ERR_INI_SIZE
$this->print_error( "Votre fichier ne doit pas dépasser ".$maxsize_Mo."Mo - (code 1)" );
return false;
break;
case 2: // UPLOAD_ERR_FORM_SIZE
$this->print_error( "Votre fichier ne doit pas dépasser ".$maxsize_Mo."Mo - (code 2)" );
return false;
break;
case 3: // UPLOAD_ERR_PARTIAL
$this->print_error( "L'envoi de l'image a été interrompu pendant le transfert" );
return false;
break;
case 4: // UPLOAD_ERR_NO_FILE
$this->print_error( "Le fichier que vous avez envoyé est vide" );
return false;
break;
}
}
private function testsize(){
$size = filesize($this->image_src['size']);
$maxsize_Mo = round( $this->maxsize / 1000000 );
if( $size > $this->maxsize ){
$this->print_error( 'Votre fichier ne doit pas dépasser '.$maxsize_Mo.'Mo' );
return false;
} else {
return true;
}
}
Voilà, si l'image dépasse 8Mo j'arrive pas jusqu'a ces test, alors que tout fonctionne bien en dessous de 8Mo.
PS : je ne souhaite pas augmenter la limite, mais juste faire en sorte que mon script ne s'arrête pas en chemin :)
Merci à vous !
Décrivez ici vos erreurs ou ce que vous obtenez à la place de ce que vous attendez :(
J'ai fini par trouver un solution qui me convient à force de bidouiller
J'ai carrément désactivé les limitations dans php.ini :
enable_post_data_reading = On
upload_max_size=0
post_max_size=0
Du coup obligé d'avoir trois vérifications par la suite vu que y a plus de limite
en HTML :
<input type="hidden" name="MAX_FILE_SIZE" value="2048576" />
Et en PHP :
Bonjour,
regarde dans ton fichier php.ini le temps d'exécution d'un script.
http://php.net/manual/fr/info.configuration.php#ini.max-execution-time
http://php.net/manual/fr/function.set-time-limit.php)
http://php.net/manual/fr/info.configuration.php#ini.max-input-time
Bonjour, merci pour ta réponse,
Je l'ai passé de 300 à 3000 dans php.ini et ça ne change rien
J'ai aussi essayé cette méthode : http://www.axew3.com/w3/2016/11/warning-post-content-length-of-bytes-exceeds-the-limit-how-to-fix/
ça n'affiche plus l'erreur, mais j'ai toujour le même problème le script s'arrête et il manque des infos sur ma page.
Merci c'est moi qui génère cette erreur volontairement.
Le problème c'est qu'au lieu que mon script php teste et affiche l'erreur personnalisée, et bien ce warning empêche mon code de continuer.
Donc ma page ne s'affiche pas correctement car les éléments n'ont pas été défini par la suite du script.
En attendant j'ai mis la limite à 32Mo pour pas trop être géné, et que mon script génère la bonne erreur et affiche la page comme il faut.
Voici pourquoi c'est très génant :
J'upload une vidéo de 385Mo à la place d'une image avatar 2Mo, et ça n'affiche même pas l'erreur adaptée au mauvais upload, mais ça vide tous mes champs et génère d'autres erreurs à la place car le script s'arrête à cause du warning. C'est vraiment très très embettant