Страницы

Поиск по вопросам

четверг, 9 апреля 2020 г.

Yii2, файл вне web, скачать его

#php #yii2 #apache2

                    
В проекте на Yii2, я загружаю через форму файлы в папку files, находящуюся в корне
проекта, а не в папке web. 

Как вывести ссылки на эти файлы в view, чтобы их можно было скачивать, как-то динамически?
    


Ответы

Ответ 1



У меня нет под рукой ни php, ни Yii2, поэтому ограничусь подсказками, а не готовым решением из разряда "скопируй и выполни". Вам нужен некий контролер, назовем его FilesController: class FilesController extends Controller { // ... } Внутри него будут два action'а - actionIndex и actionDownload. Первый будет служить для показа списка файлов, а второй для непосредственной выдачи содержимого файла пользователю. Так же нам понадобится некое свойство, которое будет содержать путь к папке с файлами. В Yii2 путь к корневой папке находится в Yii::$app->basePath. Соответственно, пишем в методе инициализации контролера: /** * @var string */ private $path; public function init() { $this->path = realpath(Yii::$app->basePath . '/files/'); } В actionIndex получаем список файлов и передаём его в view: public function actionIndex() { $files = array(); foreach (new DirectoryIterator($this->path) as $item) { array_push($files, $item->getFilename()); } return $this->render('files', array( 'files' => $files )); } В view вам нужно будет вывести список ссылок указывающих на actionDownload. Url для каждого файла можно получить примерно так: Url::to(['download','name'=> $fileName]); Ну и собственно в actionDownload отдаём файл(для $name желательно добавить валидацию, что бы пользователи не присылали всякую ересь): public function actionDownload($name) { return Yii::$app->response->sendFile($this->path . $name); }

Ответ 2



Как я понял вопрос, вы загружаете файлы - ресурсы для пользователей сайты(документы, картинки ит.д.). То вам следует их загружать в папку web - чтобы они были доступны для просмотра и скачивания. Папка assets - нужна для ресурсов относящихся к frontend части сайта(скрипты, стили, иконки и т.д.)

Ответ 3



https://habrahabr.ru/post/151795/ Можно просто сообщить nginx что бы он отдал файл из закрытой директории. function file_force_download($file) { if (file_exists($file)) { header('X-Accel-Redirect: ' . $file); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file)); exit; } }

Ответ 4



В Yii из коробки есть только два варианта - файлы видны (папка web) и файлы не видны (любая другая папка). Соответственно, без внесения своих изменений непосредственно во фреймворк, единственное, что можно сделать - это переносить нужные файлы из невидимой папки в web путем подключения их как ресурса (Asset). Что в итоге все равно соберет (продублирует) все файлы в папку web. Так что, это бессмысленно.

Комментариев нет:

Отправить комментарий