2009-04-21 18 views
11

Oto mój problem. Próbuję wywołać stronę: foo.php? DocID = bar i zwróć plik PDF na ekran, który jest przechowywany jako BLOB w DB.IE (HTTPS): generowanie pliku pdf z pliku php nie działa

Oto fragment mojego kodu, które faktycznie zwraca 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.'); 
} 

To działa perfekcyjnie w Firefoksie.

Jednak w IE nic nie pokazuje. Jeśli jestem na innej stronie (np. Google.com) i wpisuję adres URL, aby przejść do tej strony, będzie to oznaczało, że to zrobione, ale nadal będę mieć stronę google.com na moim ekranie.

Sprawdziłem nagłówki odpowiedzi obu programów: firefox i IE. Są identyczne.

Czy ktoś ma jakieś sugestie? Potrzebujesz więcej informacji?

EDIT: Jeśli to pomaga w ogóle, oto nagłówek odpowiedzi i pierwsza linia treści:

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: Ponadto, strona, która wyciąga plik pdf faktycznie korzysta z HTTPS zamiast HTTP.

Dzięki z góry,

~ Zack

+0

zorientowali się problem. Zobacz moje wyjaśnienie poniżej: –

Odpowiedz

19

Wyjaśniałem, o co chodziło. Jest to błąd IE zajmujący się IE, HTTPS i dodatkami. (Patrz here)

To był problem z buforowaniem. Kiedy ustawić:

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

(patrz here), PDF w pamięci podręcznej był wystarczająco długi dla czytelnika adobe dodatek, aby go złapać.

+1

Dla wszystkich użytkowników .NET, którzy natkną się na ten lub podobny problem, zobacz tutaj: http://stackoverflow.com/questions/1038707/cant-display-pdf-from-https-in-ie-8-on-64 -bit-vista/1140875 # 1140875 – wweicker

+1

+1 - Miał podobny problem z plikiem csv. To naprawiło to. Dzięki! –

+1

+1000000 - Wyszukiwane wysokie i niskie i jest to jedyne combo, które rozwiązało to dla mnie !! –

-2

myślę, że trzeba dodać więcej nagłówków.

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

Nie próbuję tworzyć go jako pobierania (tj. Czy ma to okno pop-up). Po prostu chcę, aby był widoczny przez czytnik Adobe Reader w przeglądarce. –

+0

Spróbuj wymazać nagłówki pobierania i pobierania, a następnie – Matt

+0

Czy możesz użyć więcej niż jednego nagłówka Content-type? – Calvin

3

miałem ten problem też użyłem następujących składników, które wydaje się działać prawidłowo

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

Nie wydaje się, żeby to działało. . Długość treści nie obejmuje nagłówka, prawda? Ponadto, nazwa pliku $ jest po prostu dowolna, prawda? Właśnie nazwałem pobrany plikFile.pdf. –

2

Spróbuj tego:

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"); 

Ponadto, jeśli używasz sesji, można spróbować ustawienie

session_cache_limiter("none"); 

lub

session_cache_limiter("private"); 
0

To był tylko nagłówek Musiałem zmienić:

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'); 
}