2012-01-31 4 views
1

J'ai un dossier protégé par mot de passe htaccess avec plusieurs fichiers dedans. Les utilisateurs ne sont pas autorisés à accéder à tous les fichiers, mais sont autorisés à télécharger les leurs. Comme je n'arrive pas à lier le lien au fichier et que la copie/suppression n'est pas une vraie solution, je pensais ouvrir le fichier en utilisant file_get_contents et le renvoyer dans la page en utilisant l'en-tête de droite. Mais .. je ne le fais pas fonctionner .. Voici mon code. L'erreur que je reçois est que lors de l'ouverture du fichier, je reçois une erreur "fichier est endommagé" d'Acrobat.Copier et télécharger un fichier dans le dossier protégé htaccess

<?php 
$file = "cms/docs/5641-1.pdf"; 
header('Content-Description: File Transfer'); 
header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename='.basename("exoticfilename.pdf")); 
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)); 
if (file_exists($file)) 
{ 
    echo file_get_contents($file); 
} 
?> 

Dans cet exemple, j'utilise simplement un fichier PDF, mais il existe plusieurs types de fichiers. Par conséquent, je devrais probablement changer l'en-tête en fonction du type de fichier. Y a-t-il une solution pour cela, ou devrais-je simplement utiliser une instruction if/else très longue?

S'il y a un autre, une meilleure façon, je suis ouvert pour cela.

MISE À JOUR

Les travaux ci-dessus, mais pas avec tous les fichiers. Les fichiers PDF plus anciens (Acrobat 6) ne fonctionnent pas, mais les fichiers Acrobat X fonctionnent. Même compte pour les fichiers docx. Certains travaillent, d'autres non. Très bizarre, puisque je suis capable d'ouvrir tout directement sur mon PC. Je suppose qu'il a quelque chose à voir avec la ligne application/pdf (ou application/vnd.openxmlformats-officedocument.wordprocessingml.document 'pour docx). Tous les autres, comme les images, fonctionnent.

+0

J'ai copié votre code et ça marche bien. Essayez d'ajouter 'die()' après 'file_get_contents' – Narek

+0

Merci Narek. J'ai essayé die() mais cela n'a pas fonctionné. Je viens de le tester avec un fichier PDF plus ancien et cela fonctionne. Se pourrait-il qu'il y ait quelque chose de mal dans l'en-tête du fichier? Y at-il peut-être une sorte d'en-tête "général" que je peux utiliser pour différents PDF, DocX, Tiffs et ainsi de suite? Je veux dire dans cet en-tête de ligne ('Content-type: application/pdf'); – mat

+0

@mat, je vois votre point, je vais supprimer mes commentaires précédents, car ils semblent être hors de propos. – Jacco

Répondre

0

Puisque vous utilisez htaccess/htpasswd pour protéger le répertoire des sangsues de liaison à chaud. Vous bloquez par inadvertance l'accès aux fichiers à partir d'une source externe telle qu'un navigateur du côté client. Étant donné que le répertoire nécessite une authentification pour accéder aux fichiers qu'il contient, vous devez le contourner. Dans un sens d'authentification à travers le script. Je l'ai vu faire avant, et vous pouvez trouver une des nombreuses références sur le sujet ici http://koivi.com/php-http-auth/

, mais la ligne de fond est htaccess et htpasswd sur exécuter vos scripts, même si sur la même machine hôte, car ils sont en manque de mieux niveau de serveur de description, a couru avant même php commence son processus sur un chargement de la page.

+0

Pas entièrement puisque je suis capable de télécharger les fichiers. Même les bons fichiers parfois, mais les anciens PDF semblent causer le problème. Le même nombre compte pour les anciens fichiers doc. – mat

Questions connexes