2009-08-07 7 views
1

Quelle est la meilleure pratique lors de la diffusion de fichiers à partir de Zend Framework MVC? Ces fichiers doivent être servis à partir du MVC car ils sont protégés.Servir des fichiers dans Zend Framework MVC

Je sais que vous pouvez lire dans le fichier et le placer dans l'objet Response, mais cela semble être une mauvaise pratique car vous devriez lire tout le fichier en mémoire puis le servir. En ce moment je fais habituellement:

header('Content-type: image/jpeg'); 
fpassthru(fopen($path, 'rb')); 
exit; 

Mais cela ne semble pas non plus juste car j'arrête l'exécution du script. Aucune suggestion?

Répondre

1

Je ne vois rien de mal avec juste exit(); Ce dont vous devez faire attention, ce sont les couches de tampons de sortie que vous pouvez avoir (compression gzip, etc). Les fichiers volumineux peuvent faire exploser ces tampons assez rapidement, donc vous aurez envie de les fermer et potentiellement 'chunk' votre sortie avec une boucle fopen/fread.

1

Vous pouvez essayer d'utiliser l'en-tête X-Sendfile. Il est supporté par lighttpd et les versions plus récentes d'apache. Fondamentalement, le serveur Web remplacera la sortie du script par le fichier que vous avez spécifié. L'inconvénient étant qu'il est spécifique à la configuration du serveur web, vous pouvez donc être sur un hôte qui ne le supporte pas.

+0

Ce serait bien, mais nous avons assez de problèmes avec les configurations de serveur étant détraqué ici que je ne veux pas compter sur cela. – smack0007

1

Je suggère de construire un script super simple pour récupérer des fichiers basés sur le système de ticket comme dans CMS, vous générez un ticket pour DB - filename, hash unique et que rediriger vers le script de retouche de fichiers super simple (file.php ? hash = asd52ad3as1g5). Il récupère le hash de la requête et, sur la base de celui-ci, récupère le vrai nom de fichier et le pousse à sortir comme vous l'avez écrit en utilisant fpassthru. Le hachage doit être unique et difficile à deviner ...

+0

mais juste si vous avez besoin de terminer votre script, je pense qu'il n'y a rien de mal avec exit() il est aussi utilisé dans les redirections internes de ZF;) –