Upload de fichier

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Upload de fichier

Re: Upload de fichier

par AB » 12 juin 2011, 20:59

Je parlais de wampserveur :
; Output buffering is a mechanism for controlling how much output data
; (excluding headers and cookies) PHP should keep internally before pushing that
; data to the client. If your application's output exceeds this setting, PHP
; will send that data in chunks of roughly the size you specify.
; Turning on this setting and managing its maximum buffer size can yield some
; interesting side-effects depending on your application and web server.
; You may be able to send headers and cookies after you've already sent output
; through print or echo. You also may see performance benefits if your server is
; emitting less packets due to buffered output versus PHP streaming the output
; as it gets it. On production servers, 4096 bytes is a good setting for performance
; reasons.
; Note: Output buffering can also be controlled via Output Buffering Control
; functions.
; Possible Values:
; On = Enabled and buffer is unlimited. (Use with caution)
; Off = Disabled
; Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
Mais effectivement, je pourrais mettre le output_buffering en prod, ce qui me gêne, c'est que cela ferait une différence d'exécution entre dev et prod, ce qui n'est jamais très bon.
Oui ... en même temps, il y a bien d'autres réglages qui sont différents entre le dev et la prod, donc j'ai envie de te dire un de plus ou un de moins :) Et puis habituellement on affiche pas les erreurs en prod et donc si display_errors = Off ou display_startup_errors = Off, tu peux laisser Output buffering = Off et ça fonctionnera.

Re: Upload de fichier

par epommate2 » 12 juin 2011, 06:22

Pour résoudre le problème il suffit de suivre les conseils de configuration :
Heuh, les conseils de qui ? En ce qui me concerne, je met toujours output_buffering à off en développement pour bien voir les erreurs qui se produisent notamment
avant les redirections HTTP. Mais effectivement, je pourrais mettre le output_buffering en prod, ce qui me gêne, c'est que cela ferait une différence d'exécution entre dev et prod, ce qui n'est jamais très bon.

Néanmoins, il reste donc bien une erreur qui ne peut pas être résolu selon la config du php.ini (c'est je trouve l'aspect le plus détestable du PHP...)

Re: Upload de fichier

par AB » 11 juin 2011, 20:21

Ah mais tu n'avais pas tout dit :)
C'est output_buffering = Off qui cause le problème.

Pour résoudre le problème il suffit de suivre les conseils de configuration :
Development Value: 4096
Production Value: 4096
donc
output_buffering = 4096

Re: Upload de fichier

par epommate2 » 11 juin 2011, 05:48

Voici les élements important de mon php.ini, notamment le display_startup_errors.

output_buffering = Off
error_reporting = E_ALL | E_DEPRECATED | E_STRICT
display_errors = On
display_startup_errors = On

Je suis sur ma machine (Ubuntu 10.04) et PHP 5.3.2-1ubuntu4.9, mais j'ai constaté le problème sur la plupart des serveurs configurés comme indiqué précédemment.

Re: Upload de fichier

par AB » 10 juin 2011, 23:10

Bah non même en mettant E_ALL partout dans le phpini, confirmé par le phpinfo error_reporting 30719 en local et en master, chez moi ça fonctionne parfaitement.

J'ai testé il y a quelques temps sur plusieurs serveurs distants et ça fonctionnait aussi partout, excepté chez free, qui intercepte le script et envoi une page d'erreur personnalisée, puis quand on fait retour arrière avec le bouton du navigateur on obtient la page originale avec la mention "Le poids total maximum du formulaire autorisé par le serveur est dépassé" (comme prévu). Mais chez hébergeurs pro je n'ai jamais vu ce pb.

Re: Upload de fichier

par epommate2 » 09 juin 2011, 15:27

Non, cela ne fonctionne pas non plus avec la classe.

Est-ce que tu as bien le error_reporting du php.ini (ou du apache) à E_ALL et pas à E_ALL & ~E_NOTICE ?

A priori, c'est celui-ci qui est pris en compte, car l'erreur arrive avant même que le fichier php est commencé à être analysé et donc, fatalement, avant ton error_reporting.

Re: Upload de fichier

par AB » 02 juin 2011, 01:15

Etonnant, personne n'a soulevé ce problème avant :-k

Essaies plutôt la classe qui est plus complète (en lien dans le dernier message du tuto) et plus rapide à tester.

Je viens de tester la classe en local et même avec
error_reporting(E_ALL);


j'obtiens bien le message voulu à la suite de mes formulaires :
"Le poids total maximum du formulaire autorisé par le serveur est dépassé"

Re: Upload de fichier

par epommate2 » 01 juin 2011, 08:03

Bonjour,

Merci pour ta réponse.

Toutefois, celle-ci ne me permet pas de résoudre mon problème.

En effet, dans ton premier script, si tu envoie un fichier de taille supérieur à post_max_size ET que error_reporting est à E_ALL et bien... ton script ne fonctionne pas non plus...

J'en viens à me demander s'il existe une solution, mais pour le moment, je dirais que non...

Re: Upload de fichier

par AB » 31 mai 2011, 17:13

Oui tu as un tuto sur le sujet ici qui gère le dépassement de upload_max_size, et une classe d'upload qui intègre la gestion de ces erreurs ici (avec en plus la gestion du dépassement mémoire en cas de redimensionnement d'images jpg).

Upload de fichier

par epommate2 » 31 mai 2011, 10:01

Bonjour,

J'ai un problème sur un code extrêmement simple et malgré des recherches, je n'arrive pas à trouver de solution.

Le code de test.php :
<pre>
<?php 
print_r($_POST);
print_r($_FILES);
?>
</pre>

<form action='test.php' method="post" enctype="multipart/form-data">
	<input type='hidden' name='test' value='42' />
	<input type='file' name='fichier' />
	<input type='submit'  />
</form>
Lorsque le fichier à uploader dépasse upload_max_size, alors :
* $_POST et $_FILES sont vidés (mais ça, ca ne me gène pas)
* l'interpréteur émet le warning suivant :
Warning: POST Content-Length of 85622833 bytes exceeds the limit of 8388608 bytes in Unknown on line 0

Et c'est cela qui me gène beaucoup, en effet, il n'est alors plus possible de rediriger l'utilisateur, ni même de démarrer une session une fois cette erreur partie (et le numéro de la ligne indique que l'erreur part avant de pouvoir faire quoique que ce soit, y compris un error_reporting(0) ou quelque chose du style).

Donc... avez-vous une solution qui :
- ne demande pas à modifier le error_reporting globale
- ne demande pas une modification de upload_max_size, post_max_size, memory_limit, etc ...
- permette de récupérer l'erreur et de rediriger proprement l'utilisateur (sans changer non plus le output_buffering bien sur)

Merci beaucoup !