Страницы

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

суббота, 22 июня 2019 г.

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

В проекте на Yii2, я загружаю через форму файлы в папку files, находящуюся в корне проекта, а не в папке web.
Как вывести ссылки на эти файлы в view, чтобы их можно было скачивать, как-то динамически?


Ответ

У меня нет под рукой ни 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); }

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

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