В проекте на 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);
}
Как я понял вопрос, вы загружаете файлы - ресурсы для пользователей сайты(документы, картинки ит.д.). То вам следует их загружать в папку web - чтобы они были доступны для просмотра и скачивания. Папка assets - нужна для ресурсов относящихся к frontend части сайта(скрипты, стили, иконки и т.д.)
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;
}
}
В Yii из коробки есть только два варианта - файлы видны (папка web) и файлы не видны (любая другая папка). Соответственно, без внесения своих изменений непосредственно во фреймворк, единственное, что можно сделать - это переносить нужные файлы из невидимой папки в web путем подключения их как ресурса (Asset). Что в итоге все равно соберет (продублирует) все файлы в папку web. Так что, это бессмысленно.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Предо мной, стояла задача интегрировать в сайт бд стран и городовПрочел несколько статей и решил интегрировать с api в контакте