IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Taille d'un fichier uploadé


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut Taille d'un fichier uploadé
    Bonjour,

    Je rencontre actuellement un petit soucis en programmation HTML / PHP. Certains internautes tentent d'envoyer des fichiers beaucoup trop volumineux pour le serveur. La directive php upload_max_filesize est initialisée aux alentours de 8Mo. Certains internautes ont essayé d'envoyer des fichiers de plus de 10Mo, donnant un message de log de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PHP Warning:  POST Content-Length of 15713518 bytes exceeds the limit of 8388608 bytes in Unknown on line 0
    Sur http://www.php.net/manual/en/feature...oad.errors.php, nous pouvons voir que $_FILES['mon_fichier']['error'] devrait contenir la valeur UPLOAD_ERR_INI_SIZE si un envoi avec une taille supérieure est fait.

    Pourtant, quand je fais un var_dump() sur $_FILES lorsque je suis en method POST après l'envoi du fichier trop volumineux, la variable $_FILES est vide (tableau vide). Le formulaire fonctionne parfaitement lorsque la personne envoie un fichier de taille correcte.

    Le serveur tourne en PHP 5.2.6.

    Est-ce normal que ce tableau soit toujours vide dans le cas d'un dépassement de la taille maximale configurée dans php.ini ? Tous les autres messages d'erreurs me sont parfaitement fourni par PHP. Si c'est normal, comment puis-je m'arranger pour envoyer un message d'erreur aux utilisateurs sans me baser sur le fait que $_FILES ne contient pas d'entrées (ce qui pourrait indiquer une erreur d'un autre type ou une manipulation du formulaire) ?

    Merci d'avance pour vos réponses.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Bonjour,

    as-tu essayé dans ton formulaire HTML de définir une taille max de fichiers ?


    Le champs caché MAX_FILE_SIZE (mesuré en octets) doit précéder le champ input de type file et sa valeur représente la taille maximale acceptée du fichier. Ceci est considéré comme un conseil pour le navigateur, bien que PHP l'utilise également. Il est très facile de contourner cette restriction. Ne comptez pas sur le respect de cette configuration par le navigateur! La configuration de PHP sur la taille maximale à respecter ( upload_max_filesize ) ne peut être contournée, elle. Vous devez ajouter la variable MAX_FILE_SIZE à votre formulaire dans tous les cas car il prévient le chargement de gros fichiers qui demanderait un long délai d'attente au client et ainsi fera échouer le script.
    Karl3i.

  3. #3
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut
    Je n'avais pas testé avec cette directive HTML. J'ai ajouté à mon script le champs hidden et mon code est donc pour la ligne contenant ce champs de formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <tr>
      <td>logo (.jpg, .gif ou .png, max 1Mo)</td>
      <td>
        <input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
        <input type="file" name="image" />
      </td>
    </tr>
    La description précise bien que le champ hidden doit être placé avant le champs de formulaire, ce qui est le cas ici. Internet Explorer et Firefox m'autorisent tous deux encore à envoyer des fichiers de 19Mo avec mon formulaire.

    De plus, j'aurais quand même aimé comprendre pourquoi mon $_FILES est vide quand j'envoie un fichier trop volumineux alors qu'une directive d'erreur spécialisée est prévue dans la documentation.

    Je ne sais pas si j'ai utilisé incorrectement l'indication HTML de la valeur maximale pour le fichier. Dans tous les cas, je ne vois aucune modification du comportement à l'utilisation. Mon formulaire marche toujours aussi bien pour les fichiers de taille standard.

  4. #4
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut
    Je viens de remarquer une chose qui me paraît encore plus étrange : non seulement le $_FILEs est vide, mais le $_POST l'est aussi. J'ai créé un fichier de test sur le serveur en dehors de mon application. Voici le code HTML que j'envoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <form method="post" action="/testenvoifichier.php" enctype="multipart/form-data">
    <table>
    	<tr>
    		<td>file</td>
     
    		<td><input type="hidden" name="MAX_FILE_SIZE" value="1000000" /><input type="file" name="fichier" /></td>
    	</tr>
    	<tr>
    		<td>file</td>
    		<td><input type="text" name="du_texte" value="blabla" /></td>
    	</tr>
    	<tr>
    		<td></td>
     
    		<td><input type="submit" value="tester" /></td>
    	</tr>
    </table>
    </form>
    Voici à présent mon traitement POST :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if($_SERVER['REQUEST_METHOD'] == 'POST'){
    	var_dump($_POST);echo '<br /><br />';
    	var_dump($_FILES);
     
    }
    Voici le résultat quand j'envoie par le formulaire un fichier PHP d'environ 1000 octets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    array(2) { ["MAX_FILE_SIZE"]=>  string(4) "1000" ["du_texte"]=>  string(6) "blabla" }
     
    array(1) { ["fichier"]=> array(5) { ["name"]=> string(14) "export_dom.php" ["type"]=> string(24) "application/octet-stream" ["tmp_name"]=> string(14) "/tmp/phpSA1xWp" ["error"]=> int(0) ["size"]=> int(1205) } }
    Voici le même affichage quand j'envoie le formulaire avec un fichier ZIP contenant des images et pesant 19.1Mo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    array(0) { }
     
    array(0) { }
    Des suggestions sur ce code?

  5. #5
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Je te l'accorde, le phénomène que tu remarque est assez troublant.
    Je n'est malheureusement pas de solution, car tout fonctionne correctement de mon coté.

    A défaut de solution, et bien je te propose les suggestions suivantes.
    D'aller voir du coté des logs d'erreurs, comme le php_error.log, et apache_error.log. Sait on jamais.

    Puis as tu activé l'affichage des erreurs : display_error à On. Peut être y a t-il une erreur avant que l'image soit uploadée.

    Puis à quel moment fais tu le var_dump() sur $_FILES ?
    Pour essai, l'idéal serait de le faire en tout 1er, ça éviterait on ne sait quel code plus ou moins foireux.

    Puis qui sait, le navigateur est peut être perturbé par un code HTML erroné (une balise mal fermée, etc ...).
    Peut être faire un essai dans une autre page en pure HTML avec juste le formulaire ci-dessus. Ici on élimine toutes autres erreurs.
    Par contre, je remarque un détail, c'est que le formulaire n'a pas de nom. C'est peut être bateau, mais en mettre un ne mange pas d'pain, sait on jamais.

    Remarque tu ce phénomène aussi bien en local que sur ton espace d'hébergement ?

    Pour finir, tu fais un essai avec un Zip. N'y aurait il une restrictions sur ce type de fichier ?
    Et si tu fais un essai sur une image directement (type jpg, gif, png) et dépassant la limite fixée par le php.ini, ça donne quoi ?

    Bref ... je t'ais mis ce qui me viens à l'esprit.

  6. #6
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    Puis as tu activé l'affichage des erreurs : display_error à On. Peut être y a t-il une erreur avant que l'image soit uploadée.
    Tout à fait, là j'ai fait un test sur le serveur de développement de l'entreprise sur lequel toutes les erreurs sont affichées.
    Citation Envoyé par RunCodePhp Voir le message
    Puis à quel moment fais tu le var_dump() sur $_FILES ?
    Pour essai, l'idéal serait de le faire en tout 1er, ça éviterait on ne sait quel code plus ou moins foireux.
    Je l'ai fait comme première ligne du fichier (en dehors du test IF qui vérifie si je suis bien en methode HTTP POST.
    Citation Envoyé par RunCodePhp Voir le message
    Puis qui sait, le navigateur est peut être perturbé par un code HTML erroné (une balise mal fermée, etc ...).
    Peut être faire un essai dans une autre page en pure HTML avec juste le formulaire ci-dessus. Ici on élimine toutes autres erreurs.
    Testé également dans un formulaire dans une page qui contient juste <html><head></head><body></body> et </html> pour éviter les erreurs. Toujours exactement le même comportement.
    Citation Envoyé par RunCodePhp Voir le message
    Par contre, je remarque un détail, c'est que le formulaire n'a pas de nom. C'est peut être bateau, mais en mettre un ne mange pas d'pain, sait on jamais.
    Testé, rien changé
    Citation Envoyé par RunCodePhp Voir le message
    Remarque tu ce phénomène aussi bien en local que sur ton espace d'hébergement ?
    Je ne développe pas en local pour pouvoir faire mes tests sur un clone du serveur de production de l'entreprise histoire de reproduire fidèlement l'environnement. Il n'y a pas d'intérêt à mon avis à avoir une version locale en 5.3.x de PHP et de mettre ensuite en ligne sur une version 5.2.x. Je n'ai de plus pas tellement envie de m'amuser à aller chercher sur le site de PHP une installation d'une ancienne version de PHP et d'installer tout un environnement sur ma machine pour ce simple bug
    Citation Envoyé par RunCodePhp Voir le message
    Pour finir, tu fais un essai avec un Zip. N'y aurait il une restrictions sur ce type de fichier ?
    Et si tu fais un essai sur une image directement (type jpg, gif, png) et dépassant la limite fixée par le php.ini, ça donne quoi ?
    Je n'avais pas de fichier image sous la main de très grande taille, mais j'ai testé avec un fichier SQL de 50Mo, le problème persiste et reste toujours le même. J'ai également testé avec un autre fichier SQL de 250Ko, le var_dump m'affichait des valeurs tout à fait correctes.

    Je ne comprends toujours pas et n'arrive pas à résoudre ce soucis.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Bonjour,

    comme l'a suggéré RunCodePhp, as-tu regardé php_error.log, et surtout apache_error.log / apache access log voir ce qui se passe ?

    Karl3i.

  8. #8
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut
    Après de nouveaux tests, j'ai trouvé cette erreur dans les logs. Je ne sais pas si elle apparaît tout le temps, mais elle est venue sur mes derniers tests :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [08-Mar-2010 15:33:14] PHP Warning:  POST Content-Length of 46190975 bytes exceeds the limit of 8388608 bytes in Unknown on line 0
    Le log apache contient la ligne d'envoi du fichier en POST comme attendu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    business 192.168.1.132 - - [08/Mar/2010:15:33:14 +0100] "POST /testenvoifichier.php HTTP/1.1" 200 482 "http://business/testenvoifichier.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729)"
    Le log d'erreur d'Apache ne contient pas d'erreur quant à lui.

    Le warning de php ne m'aide pas beaucoup car il ne me donne pas de moyen de gérer l'envoi d'un fichier trop important. De plus, l'erreur est un peu bizarre vu que le script exécuté est noté comme "unknown" à la ligne "0"...

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Il ya 3 variables qui régissent la taille des fichiers uploadés :
    MAX_FILE_SIZE qu'on peut fixer dans le formulaire et qui permet de signaler directemnt que le fichier est trop gros
    upload_max_filesize dans le php.ini qui fixe la taille maximale acceptée par le serveur pour un fichier (la taille par défaut est 2Mo)
    post_max_size dans le php.ini qui définit la taille maximale de l'ensemble des données envoyées par le formulaire (la taille par défaut est 8 Mo)

    Un fichier de taille supérieure à MAX_FILE_SIZE mais inférieure à upload_max_filesize renverra une erreur UPLOAD_ERR_FORM_SIZE.
    Un fichier de taille supérieur à upload_max_filesize mais inférieure à post_max_size renverra une erreur UPLOAD_ERR_INI_SIZE.
    Un fichier de taille supérieur à post_max_size ne sera pas uploadé du tout, ou partiellement ou autre problème du genre.

    A priori tu dois te trouver dans le dernier cas...

    Chargement de fichiers

  10. #10
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut
    Merci à Celira pour cette réponse, je n'étais pas au courant pour la variable de configuration du php.ini définissant la taille maximale de la totalité des champs du formulaire.

    Je vais regarder de ce côté là.

Discussions similaires

  1. Taille d un fichier uploadé
    Par BATCHOS CON TEQUILA dans le forum ASP.NET
    Réponses: 6
    Dernier message: 02/10/2008, 11h03
  2. [WB1] Vérifier la taille d'un fichier uploadé
    Par basam95 dans le forum WebDev
    Réponses: 2
    Dernier message: 10/06/2008, 10h17
  3. [CKEditor] taille maximale des fichiers uploadés
    Par Invité dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 03/12/2006, 12h38
  4. [WebForms]Comment connaître la taille d'un fichier à uploader ?
    Par WELCOMSMAIL dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 02/05/2006, 16h27
  5. [Upload] taille d'un fichier et limite d'upload
    Par fraizas dans le forum Langage
    Réponses: 1
    Dernier message: 07/10/2005, 12h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo