2014-02-10 156 views
0

我有一個內部的文檔根目錄,多數民衆贊成在執行的指數腳本:列表從文檔根目錄之外的所有子目錄和文件

/var/www/mywebsite/protected-folder/index.php

現在我有一個目錄之外包含列表文檔根目錄有文件子目錄:

/var/www/uploads/LIST OF SUBDIRECTORIES/file 

當上傳文件夾是文件根目錄裏面我用這個代碼:

<?php 
$dir = "/var/www/uploads"; 
$list = scandir($dir); /* This function sorts dirs */ 
$list = array_diff($list,array(".","..","index.php")); 

echo "<ol>"; 
foreach ($list as $file) 
{ 
    if (!is_dir($file)) echo "<li><a href='https://mysite.ca/protected-folder/uploads/$file'>$file</a></li>\n"; 
} 
echo "</ol>"; 
?> 

但是,除非登錄並且可以訪問此腳本,否則此文件夾需要公開爲私人。

如何創建指向文檔根目錄外的文件夾的鏈接,以及如果單擊該鏈接以顯示該目錄內的文件?

編輯:爲了使我的問題更加清晰的上傳文件夾將有子目錄的兩層,這將是一個未知的數字:/var/www/uploads/UNKNOWN LIST OF SUBDIRECTORY LEVEL 1/UNKNOWN SUBDIRECTORIES LEVEL 2/ALL FILES (file can be any file type)

這是使用Apache的指標,允許用戶通過橫向之前做的方法子目錄。這必須是安全的,以防止直接的URL訪問,因此這就是我想要的工作:

  1. 列出所有的第一個子目錄鏈接(鏈接到所有子目錄級別1)

  2. 然後,一旦鏈接當點擊列表中的所有子目錄級別2文件夾是在子目錄級別1

  3. 最後,如果該鏈接(子目錄2)點擊顯示所有處於子目錄中的文件2

希望清理東西

回答

0

您所擁有的代碼並不關心目錄位於文檔根目錄之內還是之外。只需鏈接到一個PHP文件來檢索文件本身(而不是文件上傳的鏈接,因爲它不可用)。要檢索文件,只需使用腳本獲取內容並輸出即可。

事情是這樣的:

<?php 
$path = '/var/www/uploads'; 
$file = do_something_to_make_this_safe($_POST['file_to_retrieve']); 

$type = mime_content_type($path . '/' . $file); 
$contents = file_get_contents($path . '/' . $file); 

header('Content-Type: ' . $type); 
header('Content-Disposition: attachment;filename=' . $file); 
print $contents; 

?> 

注意你需要確保有人不污染與東西像..文件路徑嘗試訪問被禁止的文件。 (因此do_something_to_make_this_safe()

+0

我將如何獲得發佈信息?這個腳本需要是自動的,不應該從用戶那裏得到任何信息。它應該簡單地輸出每個目錄 – fixnode

+0

中的文件,它可能是GET或POST。您現有的應用輸出鏈接。用戶是否不點擊這些?該鏈接會讀取類似「file.doc」 – Cfreak

+0

但鏈接連接到目錄而不是文件。 – fixnode

相關問題