De la diffusion d'un fichier volumineux à l'aide de PHP
J'ai un fichier de 200 mo que je veux donner à un utilisateur via le téléchargement. Cependant, puisque nous voulons que l'utilisateur de télécharger ce fichier une fois, nous le faisons:
echo file_get_contents('http://some.secret.location.com/secretfolder/the_file.tar.gz');
pour forcer un téléchargement. Toutefois, cela signifie que le fichier doit être chargé dans la mémoire, qui généralement ne fonctionne pas. Comment pouvons-nous diffuser ce fichier, à quelques ko par morceau?
Vous devez vous connecter pour publier un commentaire.
Essayer quelque chose comme ceci (source http://teddy.fr/2007/11/28/how-serve-big-files-through-php/):
ini_set('zlib.output_compression', 'On');
$status = fclose($handle);
cause de mon navigateur pour rediriger vers l'url du script lorsqu'elle est appelée à partir d'un téléchargement <a> tag. Cela empêche le téléchargement. Comme le descripteur de fichier se ferme par lui-même, dans mon cas, j'ai omis ce et tout fonctionne bien. Je suis curieux de savoir si quelqu'un comprend pourquoi.Utilisation
fpassthru()
. Comme le nom le suggère, il n'a pas lu tout le fichier en mémoire avant de l'envoyer, mais plutôt des sorties tout droit pour le client.Modifiées à partir de l'exemple dans le manuel:
Si vous préférez diffuser le contenu directement sur le navigateur plutôt que de télécharger (et si le type de contenu est pris en charge par le navigateur, tels que vidéo, audio, pdf, etc) puis supprimer le Contenu de l'en-tête de Disposition.
Range
. Si une valeur d'octets est présent vous pourrez ensuite utiliserfseek()
sur le fichier et l'envoyer un appropriéContent-Range
en-tête avant de l'envoyer.fpassthru
il sera de sortie le fichier dans le tampon de sortie. Mais si vous appelezob_end_flush()
d'abord, puis le tampon de sortie est désactivé, de sorte que vous n'aurez pas atteint votre limite de mémoire 😀Prendre un coup d'oeil à l'exemple de la page de manuel de
fsockopen()
:Cela se connecter à
www.example.com
, envoyer une demande ensuite d'obtenir et l'écho de la réponse à 128 octets morceaux. Vous pouvez faire plus de 128 octets.J'ai trouvé cette méthode dans http://codesamplez.com/programming/php-html5-video-streaming-tutorial
Et il fonctionne très bien pour moi
L'utilisation de cette classe, vous devez écrire du code simple comme ci-dessous: