37 votes

Très gros envois avec PHP

Je veux permettent le téléchargement de fichiers de très grande taille dans notre application PHP (des centaines de mégas - 8 gigas). Il ya un couple de problèmes avec cela, cependant.

Navigateur:

  • HTML ajouts ont de merde commentaires, nous avons besoin de sondage pour le progrès (qui est un peu idiot) ou ne pas montrer à tous les commentaires
  • Flash uploader met tout le fichier en mémoire avant de commencer le téléchargement

Serveur:

  • PHP nous oblige à définir post_max_size, ce qui peut entraîner une facilement exploitable attaque de DOS. Je voudrais pas mettre ce paramètre à l'échelle mondiale.
  • Le serveur requiert aussi d'autres variables dans le POST vars, comme une clé secrète. Nous aimerions être en mesure de refuser la demande tout de suite, au lieu d'après l'ensemble du fichier est téléchargé.

Exigences:

  • HTTP est un must.
  • Je suis flexible avec technologie côté client, tant qu'il fonctionne dans un navigateur.
  • PHP n'est pas une obligation, si il y a une autre technologie qui fonctionne bien sur un environnement linux, c'est tout à fait cool.

14voto

Frank Farmer Points 16159

upload_max_filesize peut être défini pour chaque répertoire ; il en va de même pour post_max_size

par exemple:

 <Directory /uploadpath/>
  php_value upload_max_filesize 10G
  php_value post_max_size 10G
</IfModule>
 

7voto

Aiden Bell Points 19856

Python Gestionnaire?

À l'aide d'un Python POSTE de gestionnaire au lieu de PHP. Générer un identifiant unique de votre PHP app que le client peut mettre dans les en-têtes HTTP. Avec mod_python de refuser ou d'accepter la grande télécharger avant que l'ensemble du corps POST est transmis.

Je pense http://www.modpython.org/live/current/doc-html/dir-handlers-hph.html

Vous permet de vérifier les en-têtes et baisse le reste de la POSTE d'entrée. Je n'ai pas essayé, mais peut-être le droit chemin?

En regardant la source de mod_python, la mise en mémoire tampon d'entrée via read() semble permettre de bit-à-un-temps de l'évaluation de la HTTP entrée. Les en-têtes sont en premier.

https://svn.apache.org/repos/asf/quetzalcoatl/mod_python/trunk/src/filterobject.c

7voto

Filkor Points 450

C'est vieux je sais, mais peut-être que quelqu'un a ce problème aujourd'hui aussi. Maintenant, vous pouvez le faire avec seulement Javascript et, disons, PHP. Aucun Flash ou Java requis du côté client.

démo: http://dnduploader.filkor.org/

L'idée est de découper les fichiers avec la méthode JavaScript slob () de Blob ...

3voto

Marc W Points 13166

Que diriez-vous d'un applet Java? C'est ainsi que nous avons dû le faire dans une entreprise pour laquelle j'ai travaillé auparavant. Je sais que les applets sont nuls, en particulier de nos jours, avec toutes nos options disponibles, mais ce sont vraiment la solution la plus polyvalente pour résoudre les problèmes de type poste de travail rencontrés dans le développement Web. Juste quelque chose à considérer.

2voto

acrosman Points 7688

Vous pouvez définir la valeur post_max_size uniquement pour les scripts d'un répertoire. Placez votre script de téléchargement là-bas et n'autorisez que ce script à gérer de grandes tailles. Il est encore possible que ce script soit attaqué avec des fichiers volumineux / inutiles, mais cela évite de le définir globalement.

Utilisez cela avec APC et vous pourrez peut-être trouver une solution: l' article de développeur IBM sur APC

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X