1

任务:在谷歌查看器中查看 pdf 并且用户无法在查看源中看到原始 pdf 路径/url。所以我决定通过使用会话在 php 中传递 pdf url

查看器.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,但在 google 查看器中不起作用。

但是,当我将 url 直接放在 yo readfile 中时,它可以工作。例如

readfile('http://research.google.com/archive/bigtable-osdi06.pdf');

或者

$a = 'http://research.google.com/archive/bigtable-osdi06.pdf';
readfile($a);

请帮助我,为什么会话变量在 readfile 中不起作用

对不起我的英语不好

4

2 回答 2

2

可以说这是错误的 cookie(会话)上下文。当您设置 $_SESSION 时,您的浏览器是客户端A。然后您打开 iframe 并要求通过 Google 作为客户端http://docs.google.com/viewer?下载您的(检查您的 http 服务器日志,有两个 IP)并将结果作为查看器应用程序放入您的浏览器,但您没有为客户端设置 cookie。 你应该做什么: 看起来你需要使用 rawurlencode() 在 iframe url 中设置会话 ID。pdf.phpBB

查看器.php

<?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>

pdf.php

<?php
session_id($_GET['PHPSESSID']); // we use $_GET, not COOKIE
session_start();
header('Content-type: application/pdf');
readfile($_SESSION['url']);
于 2013-04-19T07:02:39.163 回答
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 的脚本中下载文件。

于 2013-04-16T02:10:05.297 回答