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 :(

6 réponses


RiderFx3
Auteur
Réponse acceptée

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 :

  • vérif des code erreur dans $_FILES['file']['error']
  • vérif de la taille du fichier uploadé dans $_FILES['file']['size']
RiderFx3
Auteur

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.

Le message dit que tu dépasses la taille limite d'un POST (8M par défaut)
post_max_size=8M;

RiderFx3
Auteur

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.

RiderFx3
Auteur

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