任务:要在Google查看器中查看pdf,用户无法在查看源中看到原始的pdf路径/网址。所以我决定使用session
在php中传递pdf urlviewer.php
<?php
session_start();
$_SESSION['url']= 'http://research.google.com/archive/bigtable-osdi06.pdf';
?>
<iframe src="http://docs.google.com/viewer?url=http://sitename.com/pdf.php&embedded=true" width="600" height="780" style="border: none;"></iframe>
pdf.php
<?php
session_start();
header('Content-type: application/pdf');
readfile($_SESSION['url']);
?>
我使用var_dump检查pdf.php会话变量,它正确地返回http://research.google.com/archive/bigtable-osdi06.pdf,但在谷歌查看器中不起作用。
但是当我把url直接放在你的readfile中时,它就可以了。 例如
readfile('http://research.google.com/archive/bigtable-osdi06.pdf');
或
$a = 'http://research.google.com/archive/bigtable-osdi06.pdf';
readfile($a);
请帮助我,为什么会话变量在readfile中不起作用
抱歉,我的英文
答案 0 :(得分:2)
让我们说这是错误的cookie(会话)上下文。
设置$ _SESSION时,您的浏览器是客户端A
。然后打开iframe并要求http://docs.google.com/viewer?
将您的pdf.php
作为客户端B
下载到Google B
(检查您的http服务器日志,有两个IP)并将结果作为查看器应用程序放到您的浏览器中, 但您没有为客户<?php
session_start();
$_SESSION['url']= 'http://research.google.com/archive/bigtable-osdi06.pdf';
?>
<iframe src="http://docs.google.com/viewer?url=<?php
// set current session_id for feature Google GET request
echo rawurlencode("http://sitename.com/pdf.php?PHPSESSID=".session_id());
?>&embedded=true" width="600" height="780" style="border: none;"></iframe>
设置Cookie
你应该做什么:
看起来您需要使用rawurlencode()在iframes url中设置会话ID。
<强> viewer.php 强>
<?php
session_id($_GET['PHPSESSID']); // we use $_GET, not COOKIE
session_start();
header('Content-type: application/pdf');
readfile($_SESSION['url']);
<强> pdf.php 强>
{{1}}
答案 1 :(得分:1)
session_start()本身是会话密钥的特定cookie处理的包装器。它可以由session_set_save_handler()
定义。简而言之,它也会修改标题。
如果你在php脚本的顶部使用session_start(),该脚本也会在脚本中稍后调用header()来进行文件下载,那么你必须为IE添加某种形式的缓存控制才能正常工作。我使用header('Cache-Control:public');紧跟在脚本顶部的代码之后,使用session_start()调用验证我是否有正确登录的用户。这允许header()和fpassthru()调用稍后使用IE 5.5 SP2在脚本中下载文件。