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

283
19 декабря 2016, 19:38

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

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

Answer 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);
}
Answer 2

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

Answer 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;
  }
}
Answer 4

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

READ ALSO
Как внутри echo поставить php код?

Как внутри echo поставить php код?

Как правильно запихать phpкод в php? Пробовал так

197
Curl. Ошибка при отправке на сервер

Curl. Ошибка при отправке на сервер

Отправляю с помощью curl данные в ответ получаю:

202
vk api парсинг стран и городов

vk api парсинг стран и городов

Предо мной, стояла задача интегрировать в сайт бд стран и городовПрочел несколько статей и решил интегрировать с api в контакте

236