2009-04-21 5 views
11

Voici mon problème. J'essaie d'appeler une page: foo.php? DocID = bar et renvoie un PDF à l'écran qui est stocké sous la forme d'un BLOB dans la base de données.IE (HTTPS): la génération de pdf à partir du fichier php ne fonctionne pas

Voici la partie de mon code qui renvoie en fait le PDF:

$docID = isset($_REQUEST['docID']) ? $_REQUEST['docID'] : null; 

if ($docID == null){ 
    die("Document ID was not given."); 
} 

$results = getDocumentResults($docID); 

if (verifyUser($user, $results['ProductId'])){ 
    header('Content-type: application/pdf'); 
    // this is the BLOB data from the results. 
    print $results[1]; 
} 
else{ 
    die('You are not allowed to view this document.'); 
} 

Cela fonctionne parfaitement bien dans Firefox.

Cependant, dans IE, il ne montre rien du tout. Si je suis sur une autre page (c'est-à-dire google.com) et que je tape l'URL pour accéder à cette page, elle dira que c'est fait, mais je vais quand même avoir google.com sur mon écran.

J'ai vérifié les en-têtes pour les réponses de Firefox et IE. Ils sont identiques.

Quelqu'un a-t-il des suggestions? Besoin de plus d'informations?

EDIT: Si elle aide à tous, voici l'en-tête de réponse et la première ligne du contenu:

HTTP/1.1 200 OK 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Content-Length: 349930 
Content-Type: application/pdf 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: PHP/5.1.2 
Set-Cookie: PHPSESSID=cql3n3oc13crv3r46h2q04dvq4; path=/; domain=.example.com 
Content-Disposition: inline; filename='downloadedFile.pdf' 
X-Powered-By: ASP.NET 
Date: Tue, 21 Apr 2009 16:35:59 GMT 

%PDF-1.4 

EDIT: En outre, la page qui tire le fichier pdf utilise en fait HTTPS au lieu de HTTP.

Merci à l'avance,

~ Zack

+0

J'ai découvert le problème. Voir mon explication ci-dessous –

Répondre

19

J'ai compris quel était le problème. C'est un bug IE traitant de IE, HTTPS et addons. (Voir here)

C'était un problème de mise en cache. Quand je tournerai:

header("Cache-Control: max-age=1"); 
    header("Pragma: public"); 

(voir here), le PDF était en cache assez longtemps pour que le module complémentaire lecteur Adobe pour la saisir.

+1

Pour tous les utilisateurs .NET qui tombent sur ce problème ou un problème similaire, voir ici: http://stackoverflow.com/questions/1038707/cant-display-pdf-from-https-in-ie-8-on-64 -bit-vista/1140875 # 1140875 – wweicker

+1

+1 - Avait un problème similaire avec un fichier csv. Cela l'a réparé. Merci! –

+1

+1000000 - Recherché haut et bas et c'est le seul combo qui l'a résolu pour moi !! –

-2

Je pense que vous avez besoin d'ajouter d'autres en-têtes.

header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 
header("Content-Disposition: attachment; filename=THEFILENAME.pdf;"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: " . strlen($results[1])); 
+0

Je n'essaie pas de le créer en téléchargement (c'est-à-dire que cette fenêtre de sauvegarde apparaît). Je veux juste qu'il soit visible par Adobe Reader dans le navigateur. –

+0

Essayez de sortir les en-têtes force-download et download puis – Matt

+0

Etes-vous autorisé à utiliser plus d'un en-tête Content-type? – Calvin

3

J'ai eu cette question aussi, j'utilisé les éléments suivants qui semble fonctionner très bien

header("Content-type: application/pdf"); 
header("Content-Length: $length"); 
header("Content-Disposition: inline; filename='$filename'"); 
+0

Cela ne semble pas fonctionner non plus . La longueur du contenu exclut l'en-tête, n'est-ce pas? En outre, le nom de fichier $ est juste arbitraire, correct? Je viens de l'appeler downloadFile.pdf. –

2

Essayez ceci:

header("Content-Type: application/pdf"); 
header("Content-Disposition: inline; filename=foo.pdf"); 
header("Accept-Ranges: bytes"); 
header("Content-Length: $len"); 
header("Expires: 0"); 
header("Cache-Control: private"); 

En outre, si vous utilisez les sessions, vous pouvez essayer réglage

ou

session_cache_limiter("private"); 
0

Ce fut la seule tête que je devais changer:

header("Pragma: public"); 
2
if (USR_BROWSER_AGENT == 'IE') { 
    header('Content-Disposition: inline; filename="' . $name . '"'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
} else { 
    header('Content-Disposition: attachment; filename="' . $name . '"'); 
    header('Expires: 0'); 
    header('Pragma: no-cache'); 
} 
Questions connexes