2012-01-31 78 views
1

我有一個htaccess密碼保護文件夾中有幾個文件。用戶不允許訪問所有文件,但可以自行下載。複製並下載htaccess保護文件夾中的文件

由於我不能直接鏈接文件,並且由於複製/刪除不是真正的解決方案,我以爲我只是使用file_get_contents打開文件並使用正確的標題將其回顯到頁面中。但..我不明白它的工作..這是我的代碼。我得到的錯誤是,當打開文件時,我得到一個來自Acrobat的「文件已損壞」錯誤。

<?php 
$file = "cms/docs/5641-1.pdf"; 
header('Content-Description: File Transfer'); 
header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename='.basename("exoticfilename.pdf")); 
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)); 
if (file_exists($file)) 
{ 
    echo file_get_contents($file); 
} 
?> 

此外,在這個例子中,我只是使用PDF文件,但有幾種類型的文件。因此,我應該根據文件類型更改標題。有沒有解決方案,或者我應該只用一個非常長的if/else語句?

如果還有另一種更好的方法,我樂於接受。

UPDATE

上述工作,但不是所有的文件。較舊的PDF(Acrobat 6)不起作用,但Acrobat X文件可以。對於docx文件同樣重要。有些工作,其他工作則沒有。非常奇怪,因爲我可以直接在我的電腦上打開所有文件。我認爲它與application/pdf行(或docx的application/vnd.openxmlformats-officedocument.wordprocessingml.document)有關。所有其他人,如圖像,工作。

+0

我複製了你的代碼,它對我很好。嘗試在'file_get_contents'後添加'die()' – Narek 2012-01-31 09:02:17

+0

謝謝Narek。我嘗試死(),但沒有奏效。我只是用一個較舊的PDF測試它,並且工作。這可能是文件頭部有問題嗎?是否有可能用於不同PDF,DocX,Tiffs等的某種「通用」標題?我的意思是在這行標題('Content-type:application/pdf'); – mat 2012-01-31 09:10:51

+0

@mat,我明白了你的觀點,我會刪除以前的評論,因爲它們似乎不合適。 – Jacco 2012-01-31 09:50:57

回答

0

由於您使用htaccess/htpasswd來保護熱鏈接水蛭的目錄。您無意中阻止從外部來源(如客戶端的瀏覽器)訪問文件。由於該目錄需要身份驗證才能訪問其中的文件,因此您需要對其進行編寫。在某種意義上通過腳本進行身份驗證。我已經看到它之前做的,你在這裏可以找到問題的許多參考資料之一 http://koivi.com/php-http-auth/

,但底線是htaccess以及htpasswd的在運行腳本,即使在同一臺主機上,因爲他們是在一個缺乏更好的描述服務器級別的運行,即使php在頁面加載時啓動其進程。

+0

因爲我可以下載文件,所以不完全。即使是正確的文件有時,但較舊的PDF似乎會導致問題。舊版doc文件的計數相同。 – mat 2012-01-31 13:00:22

相關問題