Google Viewer网址

时间:2013-04-15 18:05:29

标签: php session

任务:要在Google查看器中查看pdf,用户无法在查看源中看到原始的pdf路径/网址。所以我决定使用session

在php中传递pdf url

viewer.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中不起作用

抱歉,我的英文

2 个答案:

答案 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在脚本中下载文件。