2009-04-21 37 views
11

Đây là vấn đề của tôi. Tôi đang cố gọi một trang: foo.php? DocID = bar và trả lại một tệp PDF cho màn hình được lưu trữ dưới dạng BLOB trong DB.IE (HTTPS): tạo pdf từ tệp php không hoạt động

Dưới đây là phần mã của tôi mà thực sự trả về 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.'); 
} 

này hoạt động hoàn toàn tốt đẹp trong Firefox.

Tuy nhiên, trong IE, nó không hiển thị gì cả. Nếu tôi đang ở trên một trang khác (ví dụ: google.com.vn) và tôi nhập URL để truy cập trang này, nó sẽ thông báo rằng nó đã hoàn tất, nhưng tôi vẫn sẽ có google.com trên màn hình của tôi.

Tôi đã kiểm tra tiêu đề cho các phản hồi từ cả firefox và IE. Chúng giống hệt nhau.

Có ai có bất kỳ đề xuất nào không? Cần thêm thông tin chứ?

EDIT: Nếu nó giúp ở tất cả, đây là phản ứng tiêu đề và dòng đầu tiên của nội dung:

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: Ngoài ra, các trang mà kéo ra file pdf thực sự sử dụng HTTPS thay vì HTTP.

Cảm ơn trước,

~ Zack

+0

tôi đã tìm ra vấn đề. Xem giải thích của tôi dưới đây –

Trả lời

19

Tôi đã tìm ra vấn đề là gì. Đó là một lỗi IE đối phó với IE, HTTPS và addons. (Xem here)

Đó là sự cố bộ nhớ đệm. Khi tôi đặt:

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

(thấy here), PDF là trong bộ nhớ cache đủ lâu để người đọc adobe add-on để lấy nó.

+1

Đối với bất kỳ người dùng .NET nào gặp khó khăn về vấn đề này hoặc tương tự, hãy xem tại đây: http://stackoverflow.com/questions/1038707/cant-display-pdf-from-https-in-ie-8-on-64 -bit-vista/1140875 # 1140875 – wweicker

+1

+1 - Đã xảy ra sự cố tương tự với tệp csv. Điều này cố định nó. Cảm ơn! –

+1

+1000000 - Tìm kiếm cao và thấp và đây là combo duy nhất giải quyết nó cho tôi !! –

-2

Tôi nghĩ rằng bạn cần phải thêm tiêu đề khác.

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

Tôi không cố gắng để tạo ra nó như là một tải xuống (tức là có cửa sổ tiết kiệm bật lên). Tôi chỉ muốn nó có thể xem được bằng trình đọc adobe trong trình duyệt. –

+0

Hãy thử lấy các tiêu đề tải xuống và tải xuống lực sau đó – Matt

+0

Bạn có được phép sử dụng nhiều tiêu đề loại nội dung không? – Calvin

3

Tôi có vấn đề này quá, tôi sử dụng những điều sau đây mà dường như làm việc tốt

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

Điều này dường như không hoạt động . Độ dài nội dung không bao gồm tiêu đề, phải không? Ngoài ra, $ filename chỉ là tùy ý, đúng không? Tôi vừa gọi nó là downloadFile.pdf. –

2

Hãy thử điều này:

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

Ngoài ra, nếu bạn đang sử dụng phiên, bạn có thể thử thiết lập

session_cache_limiter("none"); 

hoặc

session_cache_limiter("private"); 
0

Đây là tiêu đề duy nhất tôi cần phải thay đổi:

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'); 
} 
Các vấn đề liên quan