2013-09-25 94 views
1

我在我的網站的應用程序中有一個文件夾,data,它不在web根目錄中。這是爲了提高安全性,所以只有特定的人才能訪問它。我都用過,從看CakePHP的文檔中的代碼如下:在webroot之外訪問文件夾/文件仍在應用程序路徑中?

foreach($ImageToSort as $FileDisplayKey => $FileDisplayData) { 
    $FileName = $ImageToSort[$FileDisplayKey]['Fileinfo']['filename']; 
    $WholePathName = 'data/'.$FileName; 
} 

$this->response->file($WholePathName); 
return $this->response; 

它加載的文件,但不是我的視野內(上面的代碼是在一個視圖中,$ImageToSort從內查找調用設置我控制器)。

那麼我怎樣才能加載文件,不坐在一個類似的循環的webroot,所以我可以查看他們,並以我選擇的方式將他們放置在我的網站?

PS。我不能把這些文件放在webroot文件夾中,因爲有些人只需要知道文件的名稱就可以得到它。訪問這些文件需要保持少數。

非常感謝給予任何幫助,

格倫

UPDATE:

我使用2.4和從我讀意見沒有什麼,我應該使用媒體,但「發送文件'是取代他們的電話。我試圖用下面的代碼使用它們:

$this->viewClass = 'Media'; 

$params = array(
    'id'  => $FileName, 
    'name'  => 'example', 
    'extension' => 'jpg', 
    'path'  => APP . 'uploads/test' . DS 
); 

$this->set($params); 

debug($params['id']); 
$name = $params['id']; 
$path = $params['path']; 
$filename = $path.$name; 


//echo 'name::' .$name; 
echo "<img src="; 
echo $filename; 
echo ">"; 

這無法找到該文件,除非我的文件放入/webroot/data/test,然後顯示它的罰款。但那完全沒有意義?我只需要選定的用戶查看選定的文件的安全問題。

下面的代碼不工作在/app/data/test路徑內查看該文件,

$this->autoRender = false; 
$this->response->file(Configure::read('uploads').$WholePathName); 

但這代碼沒有區別在控制器或視圖中使用時,它仍只顯示文件和沒有佈局或樣式或標題或任何東西。再次,這是完全沒有意義的。

必須有一種方法可以讓我的文件訪問並讀取我需要的文件/文件夾。

格倫

+0

看看http://book.cakephp.org/2.0/en/views/media-view.html – Jelmer

+0

我已經看過它的替代品,我正在使用CakePHP 2.4 - 發送文件http:// book。 cakephp.org/2.0/en/controllers/request-response.html#cake-response-file。但是,當我使用它/做一個文件調用它將整個文件加載到瀏覽器中,而不需要我的佈局! –

+0

你在那裏添加的代碼有點危險!你使用'app'文件夾作爲基礎,這意味着你可以傳遞例如'Config/database.php'並檢索文件內容!您應該使用一個額外的文件夾(其中只包含應該可訪問的文件),如我的示例所示。 – ndm

回答

1

創建適當的控制器/動作,其接受一個路徑片段(通過查詢例如通過),檢查當前用戶是否被允許訪問的文件,結合了基本路徑的路徑片段,並輸出文件內容。

然後用相應的URL爲img元素在您看來src屬性,即像

<img src='/files/read/?file=foo/bar.jpg'> 

這樣,只有授權的用戶將能夠訪問您的文件。

這裏是一個非常基本的控制器/動作例如,有401的情況下,不允許用戶訪問文件響應,並在情況下404文件找不到,是不是一個文件或不在範圍基本路徑,並且如果一切正常它所服務的文件:

class FilesController extends AppController 
{ 
    public function read() 
    { 
     // you'd probably use auth component checks and stuff here 
     if(testWhetherUserIsAllowedToAccessFiles() !== true) 
     { 
      throw new ForbiddenException(); 
     } 

     // make sure that the base path points to a folder that only 
     // holds the files that should be accessible! 
     $base = ROOT . DS . 'files' . DS; 
     $fragment = $this->request->query('file'); 

     // expand to a canonicalized absolute path, it's way easier to 
     // test for validity using the real path 
     $path = realpath($base . $fragment); 

     // just a basic sanity check, you may want to implement some more 
     // security checks to make sure there's really no way to access 
     // files outside of the base directory! After all this is just 
     // some example code. 
     if(
      !!preg_match('~\.\.(\\\\|/)~', $fragment) || 
      $path === false || !is_file($path) || 
      mb_strpos($path, $base) !== 0) 
     { 
      throw new NotFoundException(); 
     } 

     $this->response->file($base . $fragment); 
     return $this->response; 
    } 
} 

作爲CakePHP的2.4.8的,響應對象確實爲可能的路徑遍歷片段支票,所以從理論上講,在該示例中,額外的檢查可能不需要,因爲其中一個沒有通過擴展的真實路徑,而是原始的連接的!

+0

好的,我想我得到了你在這裏說的,但是你的$ base代碼行,是指向用戶到WEBROOT文件夾?我玩弄它,非常感謝,我讓你知道我繼續。格倫。 –

+0

不,它並不指向webroot,「ROOT」是CakePHP常量,用於「app」,「lib」等文件夾所在的最頂層文件夾。只需將其更改爲您的需求,並將其指向您隱藏文件的任何位置。 – ndm

+0

COOL,謝謝。我玩弄它並回發完整的代碼,一次(或者如果?)我得到它的工作....格倫。 –

相關問題