我有一個帶有文件下載選項的網站。然而,不是每個人都可以下載每個文件。例如,如果我以管理員身份登錄,我可以下載所有文件,但如果我以客戶身份登錄,我只能下載某些文件。使用Apache和PHP的選擇性文件下載權限
目前,所有這些文件都存儲在Web根目錄之外的目錄中,因此用戶不能手動下載。我製作了一個PHP腳本來管理文件的下載,但它非常麻煩。我試過幾件事情:
1:
echo file_get_contents($file);
2:
readfile($file);
3:
if (($handle = fopen($file, "rb")) !== false)
{
while (!feof($handle))
{
echo fread($handle, 4096);
}
fclose($handle);
}
我發現所有的這些方法與測試時是非常不可靠500MB文件。第一個和第二個都會因所有瀏覽器和隨機百分比而失敗。有時候他們在幾兆字節後就已經失敗了,而其他時候他們已經達到了80%。但最終他們會停止下載沒有任何錯誤。
第三方法是最可靠的。它在Firefox中很好地下載(雖然速度太慢;當它來自本地主機時,速度大約爲700KB/s,當它工作時讀取文件的方法速度爲25MB /秒)和Chrome,但在Internet Explorer中,它大部分都失敗了。在IE中,它首先陷入「獲取文件信息」而沒有獲得任何「打開/保存」對話框。當我取消並再次嘗試時,我會看到一個「打開/保存」對話框。
我在網上搜索,我無法找到,實際工作以及任何令人滿意的方法。最好我只是希望Apache能夠處理文件下載,因爲它始終可以毫無問題地正常工作。但我不想將所有文件放入公共目錄,因爲每個人都可以下載所有文件。
我有什麼選擇?有沒有最好的方法?因爲他們填補了腳本與文件的內容存儲
設置文件/ MIME頭 - '<?標題('Content-type:application/pdf'); header('Content-Disposition:attachment; filename =「downloaded.pdf」'); // .. fread?>' – ajreal 2010-11-10 14:12:43
如果您啓用了Apache的deflate模塊,請不要忘記關閉下載腳本。它讓我頭痛了幾個小時,因爲Firefox在下載時沒有顯示進度條。要關閉它,請將'SetEnv no-gzip'添加到.htaccess文件中。 – Lekensteyn 2010-11-10 14:29:15
感謝您的提示,Lekensteyn,我看到它在另一個下載腳本示例中使用,以便及時檢查是否啓用了放氣模塊。我沒有啓用它。 – pbean 2010-11-10 15:06:49