php, téléchargement de fichier
Je suis en utilisant le simple fichier de téléchargement du script:
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
C'est de travailler sur mon localserver jusqu'à 200 mo.
Quand j'ai essayer ce code dans mon site web, il télécharge 173KB au lieu de 200 MO de fichier.
J'ai tout vérifié, a écrit une partie de code personnalisé (à l'aide d'ob fonctions et fread au lieu de readfile), mais ne peut pas télécharger de gros fichiers.
Merci pour vos réponses.
- Je suis à l'aide d'Apache 2.2, PHP 5.3
- Tous les paramètres de PHP pour traiter de gros fichiers sont ok. (temps d'exécution, les limites de la mémoire, ...
source d'informationauteur jsonx
Vous devez vous connecter pour publier un commentaire.
Un problème que j'ai avec le code suivant est que vous n'avez aucun contrôle sur le flux de sortie, votre location PHP poignée, sans savoir exactement ce qui se passe à l'intérieur de l'arrière-plan:
Ce que vous devez faire est de mettre en place un système de sortie que vous pouvez contrôler et répliqué accros serveurs.
Par exemple:
Ce n'est que de base, mais de lui donner un aller!
Également lire ma réponse ici: file_get_contents => PHP Fatal error: Allowed memory épuisé
Il semble readfile peut avoir des problèmes avec des fichiers longs. @Khez demandé, il se pourrait que le script est en cours d'exécution pendant trop longtemps. Une rapide recherche sur Google a entraîné quelques exemples de chunking le fichier.
http://teddy.fr/blog/how-serve-big-files-through-php
http://www.php.net/manual/en/function.readfile.php#99406
Une solution à certains scénarios est que vous pouvez utiliser PHP-script de décider intelligemment ce fichier à partir de l'endroit où les télécharger, mais au lieu d'envoyer le fichier directement à partir de PHP, vous pouvez retourner une redirection vers le client qui contient alors le lien direct qui est traitée par le serveur web seul.
Ce qui pourrait être fait au moins de deux façons: soit en PHP-script copie le fichier dans une "zone de téléchargement" qui, par exemple, peut être nettoyé de "vieux" fichiers régulièrement par un autre arrière-plan/service de script ou de vous exposer le véritable emplacement permanent pour les clients.
Il y a bien sûr des inconvénients comme c'est le cas avec chaque solution. Dans celui-ci, c'est que selon les clients (curl, wget, un navigateur graphique) qui demande le fichier, ils peuvent pas en charge la redirection de vous faire et, dans l'autre, les fichiers sont très exposé au monde extérieur et peut être à tout moment de lecture sans l' (accès) contrôle du script PHP.
Avez-vous établi votre script peut courir longtemps assez et a assez de mémoire?
Avez-vous vraiment besoin de le tampon de sortie ?
La vraie solution est d'éviter d'utiliser un script PHP pour envoyer un fichier sur le client, c'est exagéré et que votre serveur est mieux adapté à la tâche.
Je suppose que vous avez une raison pour l'envoi de fichiers par le biais de PHP, peut-être les utilisateurs doivent s'authentifier en premier? Si c'est le cas, alors vous devriez utiliser X-Accel-Redirection (si vous utilisez nginx) ou X-Sendfile (précédemment X-LIGHTTPD-envoi-fichier) sur lighttpd.
Si vous utilisez Apache, j'ai trouvé quelques références à mod_xsendfile mais je n'ai jamais utilisé personnellement, et je doute c'est installé pour vous si vous avez réussi l'hébergement.
Si ces solutions sont intenables je prie de m'excuser, mais j'ai vraiment besoin de plus d'informations sur le problème réel: Pourquoi êtes-vous envoyer ces fichiers par le biais de PHP en premier lieu?