2010-11-23 24 views
1

J'ai une fonctionnalité sur un site Web dans lequel l'utilisateur se connecte, puis une liste de fichiers disponibles pour téléchargement est affichée. Quand il clique sur le fichier, il devrait afficher une boîte de dialogue de téléchargement avec les options pour ouvrir avec l'application si elle est installée pour le type de fichier (comme Acrobat Reader s'il est installé, par exemple) ou le téléchargement rapide si ce n'est pas le cas. Actuellement, je construis la liste en utilisant PHP juste en écho le chemin de chaque fichier. Ensuite, lorsque l'utilisateur clique sur le lien, le navigateur demande directement le fichier. Mon premier problème avec cela était que les fichiers ppsx ou pptx étaient affichés dans le navigateur sous la forme de fichiers texte, résultant en une vidange à l'écran. Ensuite, j'ai ajouté un fichier .htaccess dans le répertoire dans lequel les fichiers servis sont, avec ce contenu:Comment servir les fichiers à télécharger? Essayer de servir des fichiers que les utilisateurs peuvent visualiser/télécharger, mais le serveur répond par un type de contenu incorrect

Options All -Indexes 

Header set Content-Disposition attachment 

Avec ce fichier .htaccess, la boîte de dialogue du navigateur apparaît, mais, par exemple, dans Firefox, il a option "Ouvrir avec: Bloc-notes", au lieu de l'application correcte pour le fichier ou aucun si aucune application n'est installée pour le type de fichier. Je peux voir que l'en-tête de réponse Content-Type est "text/plain" et c'est faux, mais comment puis-je faire en sorte que le Content-Type correct soit détecté par le serveur?

Merci beaucoup.

Répondre

0

Vous devez utiliser le bon pour obtenir la réponse appropriée du navigateur pour un type de fichier spécifique.

Powerpoint est:

application/vnd.ms-powerpoint 

Vous pouvez modifier votre fichier .htaccess pour les types MIME mis à jour comme indiqué sur this site.

+0

Merci beaucoup pour votre réponse. On dirait que ça se passe de cette façon, mais le truc, c'est que je ne sais pas quels types de fichiers ils veulent télécharger. Il peut s'agir de PPSX, PDF, DOCX, TXT, ZIP, etc. –

+0

Je ne suis pas familier avec Apache, mais le navigateur utilisera le type de fichier quand on lui donnera un type MIME générique comme application/octet-stream Mais vous pouvez également configurer le serveur pour les types de fichiers communs que vous rencontrerez. –

0

Ok, j'ai abandonné et réécrit comment cela fonctionne. Dans mes vues, j'imprime le chemin d'accès à une méthode de contrôleur et lui passe un paramètre avec l'ID de fichier. Le contrôleur vérifie l'ID utilisateur de la session, recherche le fichier dans la base de données et puis il y a ce code:

if (file_exists($file['path'])) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.$file['name']); 
    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['path'])); 
    ob_clean(); 
    flush(); 
    readfile($file['path']); 
    exit; 
} 

Il fait avec succès le navigateur pour faire apparaître une boîte de dialogue de téléchargement donnant également la possibilité d'ouvrir la application associée si elle est installée.