2013-12-21 41 views
2

使用蛋糕版本2.4.3CakePHP的 - 保存和根目錄之外提供文件服務

所以,我在這裏有一段時間穩定的,我已經修改了這個插件在將文件保存到app文件夾https://github.com/srs81/CakePHP-AjaxMultiUpload/

的上傳的文件正被保存到/ public_html/app/files

現在奇怪的是,當試圖將這些文件提供給視圖時,我可以讀取文件名,文件大小,但不讀取文件本身,圖像,pdf等

當我嘗試通過直接url訪問文件,我得到這個錯誤:

錯誤:無法找到FilesController。

我怎麼可以讀取文件名,文件大小,而不是文件本身?

需要將文件保存在應用程序文件夾中。這些文件應該受到保護,因此只能由登錄到應用程序的用戶訪問。我試圖用蛋糕發送文件的響應沒有結果。

編輯:我猜這裏真正的問題是我如何從APP讀取文件。 DS。 '文件'?

查看代碼:

public function view ($model, $id, $edit=false) { 
    $results = $this->listing ($model, $id); 

    $directory = $results['directory']; 
    $baseUrl = $results['baseUrl']; 
    $files = $results['files']; 

    $str = "<dt>" . __("Pictures") . "</dt>\n<dd>"; 
    $count = 0; 
    $webroot = Router::url("/") . "ajax_multi_upload"; 
    foreach ($files as $file) { 
     $type = pathinfo($file, PATHINFO_EXTENSION); 
     $filesize = $this->format_bytes (filesize ($file)); 
     $f = basename($file); 
     $url = $baseUrl . "/$f"; 
     if ($edit) { 
      $baseEncFile = base64_encode ($file); 
      $delUrl = "$webroot/uploads/delete/$baseEncFile/";   
      $str .= "<a href='$delUrl'><img src='" . Router::url("/") . 
       "ajax_multi_upload/img/delete.png' alt='Delete' /></a> "; 
     } 
     $str .= "<img src='$url' /> "; 
     $str .= "<a href='$url'>" . $f . "</a> ($filesize)"; 
     $str .= "<br />\n"; 
    } 
    $str .= "</dd>\n"; 
    return $str; 

} 

而且上傳/保存

public function upload($dir=null) { 
    // max file size in bytes 
    $size = Configure::read ('AMU.filesizeMB'); 
    if (strlen($size) < 1) $size = 20; 
    $relPath = Configure::read ('AMU.directory'); 
    if (strlen($relPath) < 1) $relPath = "files"; 

    $sizeLimit = $size * 1024 * 1024; 
      $this->layout = "ajax"; 
     Configure::write('debug', 0); 
    $directory = APP . DS . $relPath; 

    if ($dir === null) { 
     $this->set("result", "{\"error\":\"Upload controller was passed a null value.\"}"); 
     return; 
    } 
    // Replace underscores delimiter with slash 
    $dir = str_replace ("___", "/", $dir); 
    $dir = $directory . DS . "$dir/"; 
    if (!file_exists($dir)) { 
     mkdir($dir, 0777, true); 
    } 
    $uploader = new qqFileUploader($this->allowedExtensions, 
     $sizeLimit); 
    $result = $uploader->handleUpload($dir); 
    $this->set("result", htmlspecialchars(json_encode($result), ENT_NOQUOTES)); 
} 

從原來的插頭唯一真正的變化正在改變WWWROOT到APP,使開關。保存工作很好,很可愛。但它只是奇怪的是,我可以在視圖中讀取的文件名,文件大小沒有問題,但不能查看圖像,PDF等

回答

4

問題:

不能顯示了外部的文件webroot通過一個直接的URL - 這就是把它們放在webroot之上的關鍵 - 讓它們不能直接訪問。

因此,首先在控制器中構建圖像src路徑(反正不是好的做法)不會改變這樣一個事實,即當該路徑到達瀏覽器時,它會讀取圖像的來源,試圖從上面的webroot,它不會/不能。

解決方案:

的解決方案是使用一個CakePHP's Sending files(曾經被認爲是Media Views)。然後,你將你的img的「src」設置爲一個控制器/動作。在這個動作中,它基本上是說「將這個動作顯示爲一個圖像」(或者pdf,或者其他任何東西)。

路徑的控制器使用方法:

把這個從中做的正是上面我的應用程序之一,這裏是我的「文件」(同一級別根目錄),用於文件的路徑:

file_exists(APP . 'files' . DS . $your_filename) 
+0

優秀的內部創建符號鏈接到您的文件夾。這是我一直在尋找的缺失部分。 – hyperweb

+0

感謝您的支持。它效果很好! – manospro

+0

你能舉一個Cake 3代碼的例子嗎? – efwjames

1

Web根目錄;-)

+0

這打破了把文件放在webroot之外的全部目的。 – Dave

相關問題