2010-05-18 94 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'); 

您可能需要進一步調整頭,但是這是基本的想法。

相關問題