2009-04-21 57 views
11

这是我的问题。我正在尝试调用一个页面:foo.php?docID = bar并将PDF返回到作为BLOB存储在数据库中的屏幕。IE(HTTPS):从PHP文件生成PDF不起作用

这里是我的代码实际上返回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.'); 
} 

这在Firefox工作完全正常。

但是,在IE中,它什么也没有显示。如果我在另一个网页(即google.com)上,并输入网址转到此页面,它会说已完成,但我仍然会在我的屏幕上显示google.com。

我检查了来自firefox和IE的响应标题。它们是相同的。

有没有人有任何建议?需要更多信息?

编辑:如果它帮助所有,这里的响应头和内容的第一行:

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 

编辑:另外,它翻出页面的PDF文件,实际使用HTTPS而不是HTTP。

由于提前,

〜扎克

+0

我想通了这个问题。看到我的解释如下 – 2009-04-21 18:55:33

回答

19

我想出了问题所在。这是一个处理IE,HTTPS和插件的IE错误。 (见here

这是一个缓存问题。当我设置:

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

(见here),该PDF是缓存足够长的时间的Adobe Reader插件抓住它。

-2

我认为你需要添加更多的标头。

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

我没有试图创建它作为下载(即有保存窗口弹出)。我只是希望它可以通过浏览器内的Adobe Reader进行查看。 – 2009-04-21 15:53:55

+0

尝试取出强制下载和下载标头,然后 – Matt 2009-04-21 16:06:50

+0

您是否允许使用多个Content-Type标头? – Calvin 2009-04-21 16:17:54

3

我有这个问题太,我用这似乎做工精细以下

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

试试这个:

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

此外,如果你正在使用的会话,你可以试试设置

session_cache_limiter("none"); 

session_cache_limiter("private"); 
0

这是我需要改变的只是标题:

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