2012-07-07 201 views
0

假設您的一些文件託管在您的網絡服務器上,但您不希望它們被直接HTTP請求檢索,因爲這些文件是保密的。我們開始加密文件名,但我們希望它進一步進一步,那麼將這些文件放在/ public_html文件夾之外,並讓PHP從/ public_html之外的文件夾中檢索所請求的文件呢?保護文件免受直接HTTP請求的影響

我想測試這個,但我的小腳本檢索我錯了文件名的0KB .pdf文件:

<?php 

$file = '/home/clientaccount/secretfiles/file.pdf'; 
if(!file_exists($file)){ 
    die('Error: File not found.'); 
} 
else 
{ 
    // Set headers 
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-Disposition: attachment; filename=$file"); 
    header("Content-Type: application/pdf"); 
    header("Content-Transfer-Encoding: binary"); 
} ?> 
+0

你使用什麼服務器?一個'.htaccess'文件可能更適合你。 – Lix 2012-07-07 13:44:26

+0

你在這之後迴應文件的內容嗎?或者是整個腳本? – 2012-07-07 13:46:26

+0

對不起,忘了添加細節:我們正在使用Apache。至於.htaccess,你可以精心設計你的想法嗎?至於回聲內容,這是整個腳本,因爲我們不是要回顯文件,而是強制文件被下載。 – Tobias 2012-07-07 13:53:23

回答

1

要使代碼正常工作,我不得不添加一個COMAND使PHP讀取文件,並將其輸出:

<?php 

$file = '/tmp/file.pdf'; 
if(!file_exists($file)){ 
    die('Error: File not found: '.$file); 
} 
else 
{ 

    // Set headers 
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-Disposition: attachment; filename=$file"); 
    header("Content-Type: application/pdf"); 
    header("Content-Transfer-Encoding: binary"); 
    readfile($file); 
} 

?> 

否則我無法讀取下載後的文件。

Hans Kuit表示,最好從文件名中刪除路徑。

+0

是的,只是試過這個,它的工作,和文件名必須重新命名爲一個簡單的字符串。謝謝大家的輸入,一點點,所有貢獻幾乎是輸出結果。謝謝大家:) – Tobias 2012-07-07 14:26:01

1

你有很多的右括號中如果,應該是:

if(!file_exists($file)){ 

這可能是服務器錯誤的原因,如果運行服務器的用戶有權訪問外部位置,您的代碼應該可以正常工作。

+0

好吧,有人在我這裏的腳下開槍......一個小錯字扔500錯誤。問題已更新。謝謝user1498339 – Tobias 2012-07-07 13:58:41

+0

我試過了你的代碼,它可以工作,但是我不得不把文件從我的主目錄移動到/ tmp /,因爲apache用戶無法訪問我的主目錄中的文件。 – user1498339 2012-07-07 14:05:29

+0

對不起,它要求下載文件,但我不能讀它(我沒有檢查這部分)。 – user1498339 2012-07-07 14:17:30

2

變量$ file只是一個字符串。到達您的訪問者的標題告訴:

內容處置:附件; filename =/home/clientaccount/secretfiles/file.pdf

這不是訪問者可以訪問的文件夾。

+0

你必須確保Apache訪問像@ user1498339提到的..還要確保你的頭只包含文件名,而不是整個路徑/到/// file.pdf – 2012-07-07 14:10:11

+0

我相信這也是正確的,會做的 – Tobias 2012-07-07 14:20:53