2013-12-21 3 views
2

Использование торт версии 2.4.3 стабильнойCakePHP - Сохранение и обслуживающие файлы за пределами корневой директории

Так что я имею время здесь, я изменил этот плагин, чтобы сохранить файлы в папку приложения https://github.com/srs81/CakePHP-AjaxMultiUpload/

The загруженные файлы сохраняются в/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 АРР, чтобы сделать выключатель. Сохранение прекрасно и прекрасно. Но его просто странно, что я не могу прочитать имя файла, размер файла в представлении не проблема, но не могут просматривать изображения, PDF и т.д.

ответ

4

Проблема:

Вы не можете отобразить файлы, которые находятся за пределами webroot через прямой URL-адрес - вот в чем все дело в том, чтобы поставить их выше webroot в первую очередь - сделать их НЕ доступными напрямую.

Таким образом, построение пути изображения src в контроллере в первую очередь (не очень хорошая практика) не изменит того факта, что когда этот путь попадает в браузер и он считывает источник изображения, пытаясь вытащить изображение из выше webroot, он не будет/не может.

Решение:

Решение использовать CakePHP's Sending files (что раньше было Media Views). Затем вы устанавливаете «src» вашего img в контроллер/действие. В этом действии он в основном говорит «отобразить это действие как изображение» (или pdf, или что-то еще).

Путь к использованию в контроллере:

принял это от одного из моих приложений, который делает именно выше, и вот путь, который я использовал для файла в «файлах» (тот же уровень, как вебсервера):

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

Отлично. Это недостающая деталь, которую я искал. – hyperweb

+0

Спасибо за это. Это здорово! – manospro

+0

Можете ли вы привести пример кода для Cake 3? – efwjames

1

Создать символическую ссылку на папку внутри корневой директории ;-)

+0

Это в первую очередь поражает всю цель размещения файлов вне webroot. – Dave

Смежные вопросы