2010-05-18 54 views
2

假设我有一些pdf文件存储在我的服务器上,我只想让一个付费的人可以下载一个特定的pdf。我如何只允许授权用户使用php下载pdf?

举个例子,假设我有一堆电子书。用户能够下载电子书A的唯一方式是如果他的账户包含该特定书籍的正确凭证。

完成此操作的最佳方法是什么?

关于如何改进我的想法任何想法/建议,非常感谢!

我目前的想法:

  • 用户通过他们的 /ACCOUNT_NUM/ORDER_ID/A的 特定文件的副本放置创建订单

  • 成功后,一个新的文件夹将 将存储在 这个目录中

  • 有没有php生成.htaccess 只会允许从一个url 包含一个随机散列嵌入 。
  • 的唯一方法,用户将能够 访问此随机哈希页是,如果 他们的登录身份为正确的用户, 和散列存储在数据库中的哈希 相匹配,否则 他们将被重定向到主页。

回答

4

将PDF存储在文档根目录下。当有人想下载A.pdf时,请将它们引导至如下的PHP页面:download.php?file=A.pdf。编写download.php页面来检查请求用户的权限,如果他们的权限足够好,则强制下载A.pdf。

+0

+1对我来说太快了 – 2010-05-18 15:26:34

+0

你如何强制下载文件根目录下的文件? – ThinkingInBits 2010-05-18 15:26:57

+0

会议,阅读文件:http://php.net/manual/en/features.sessions.php,http://us.php.net/manual/en/function.readfile.php – webbiedave 2010-05-18 15:29:16

4

1)保持位于文档根目录之外的,所以没有人可以通过浏览器

2)直接访问它们的PDF文件有一个PHP页面服务了PDF文件,只有这样,才能得到他们是被成功登录和验证,这是强制执行的每次下载

代码下载文件虽然PHP(请务必擦洗输入):

<?php 
    $file_name = $_GET['filename']; // somefile.pdf 
    $file = '/home/pathtofile/' . $file_name; 

    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename=' . $file_name); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
?> 
+0

非常感谢! – ThinkingInBits 2010-05-18 15:43:28

1

商店的文档根目录以外的PDF文件(如果没有可能由于一些蹩脚的托管设置,将它们存储在某个难以猜测的地方)。

检查该用户有权限,然后像做:

<?PHP 
$pdf_path = '/some/dir/'; 
header('Content-type: application/pdf'); 
readfile($pdf_path . 'mydoc.pdf'); 

您可能需要进一步调整头,但是这是基本的想法。

相关问题