2012-06-24 5 views
0

Je redirige les visiteurs de mon site de la page A à la page B. Dans la page B, je m'attends à ce que les utilisateurs obtiennent le fichier PDF téléchargé (à télécharger lors du chargement de la page B). J'ai pris le code d'un autre article (voir un previous question answered here) et mon code de la page B est le suivant:Pourquoi le fichier téléchargé n'est pas téléchargé à la place, il est affiché dans le navigateur?

<?php 
header('Content-Disposition: attachment; filename=nature.pdf'); 
header('Content-type: application/pdf'); 
$fn=fopen("/wp-content/nature.pdf","r"); 
fpassthru($fn); 
?> 

La sortie n'est pas en ouvrant une boîte de dialogue de téléchargement, au lieu des caractères illisibles sont affichés dans le navigateur telles que les suivantes (je viens ramassé un petit échantillon ci-dessous):

% PDF 1,4% 3 0 obj <> flux xMK1o + $ zig ​​& V = T = Xo K i + # V yx3 ඀ (BX pW`

Serveur: OS Linux; Version PHP: 5.2.17

Le visiteur -> Navigateur: Firefox; OS: Windows 2000

Est-il possible d'échouer en raison de l'ancien système d'exploitation côté client? Si non, quelqu'un connaît-il une solution pour forcer le téléchargement? Toute aide serait très appréciée.

Merci.

+0

try readfile ("/ wp-content/nature.pdf"); au lieu de fopen & fpassthru – Venu

+0

En fonction de la taille du téléchargement, vous pouvez utiliser 'XSendFile' (supporté à la fois par lighttpd & apache2 avec modxsendfile). Ensuite, vous servirez le téléchargement avec: 'header ('XSendFile: /wp-content/nature.pdf');' et XSendFile s'occupera du reste. – user268396

+0

@Venu - déjà essayé (voir ci-dessous lors du test du code proposé par l'utilisateur "take"). Merci. –

Répondre

1

Essayez avec l'en-tête Content-Length:

ob_clean(); ob_start(); 
header('Content-Disposition: attachment; filename=nature.pdf'); 
header('Content-type: application/pdf'); 
header ("Content-Length: ".filesize("/wp-content/nature.pdf")); 
readfile("/wp-content/nature.pdf"); 
exit; 
+0

Dois-je ajouter cette ligne à mon code? ou remplacer une ligne existante? –

+0

Ajouter à votre code - édité ma réponse à un exemple complet. – take

+0

Désolé l'homme, ne fonctionne pas –

0

Il y avait une bizarrerie dans les navigateurs très vieux quand Content-disposition a été en cours d'introduction, certains des navigateurs très vieux ne serait pas montrer " Enregistrer sous "dialogue sauf s'il ne pouvait pas reconnaître le type de fichier que vous essayiez d'ouvrir. Essayez de définir le type de contenu à rien (ou quelque chose de méconnaissable), et voyez si cela forcera l'ancien navigateur à afficher le dialogue de sauvegarde.

header('Content-type: '); 

Si cela fonctionne, alors je vous suggère d'ajouter une ligne de PHP pour détecter si oui ou non ils sont sur un ancien navigateur avant d'exécuter cette ligne, comme les navigateurs modernes utiliseront cet en-tête pour déterminer quel programme le fichier doit être ouvert avec.

+0

Non. Ne fonctionne pas Ma version de Firefox est 12.0. Est-ce trop vieux? Je veux dire que je teste le code en tant que client de ce Firefox 12.0. –

+0

de votre explication, j'ai supposé que le client qui avait le problème était sur un navigateur plus ancien.Si le navigateur ne télécharge toujours pas le fichier après que les en-têtes HTTP ont été définis correctement, il se peut qu'il s'agisse simplement d'une erreur dans la façon dont le client le gère. –

+0

Non, j'ai dit un ancien OS (système d'exploitation), pas un vieux navigateur. Donc, si vous dites "une faute dans la façon dont le client gère" ce que cela pourrait être? Est-il inclus en raison d'un ancien système d'exploitation? Si oui, je voudrais peut-être passer à tester le code d'un système d'exploitation plus moderne ... Merci quand même pour votre contribution, il est apprécié que toute entrée tente de résoudre mon problème. Je suis reconnaissant. –

Questions connexes