Скрыть файлы из публичного доступа в Yii2

209
20 апреля 2018, 14:49

Задача состоит в том, чтобы скрыть документы пользователя из публичного доступа, их может просматривать только пользователь какой загрузил эти файлы. Не знаю какой вариант лучше и есть ли смысл выносить файлы из папки web. Как лучше это реализовать?

Answer 1

Вариант А. Менее гибкий

  • Выносим файлы, закрытые от просмотра, в отдельную папку внутри web,
    например protected_uploads.

  • Устанавливаем куки для конкретного пользователя на просмотр файла. Например: файл называется my_file_325835628.png, для нужного нам
    пользователя ставим куки my_file_325835628=true, если добавляются
    еще файлы, добавляем новый куки, если удаляем разрешение, то ставим
    false или просто удаляем куки В htaccess для папки

  • protected_uploads прописываем правила типа таких (на корректность правил не претендую):
RewriteCond %{REQUEST_URI} ^(.+)\.png [NC]
RewriteCond %{HTTP_COOKIE} !$1=true [NC]
RewriteRule \.(png)$ - [NC,F,L]

Вариант Б. Более гибкий

  • Выносим нужные файлы за пределы папки web
  • Где-то у храним данные, какие файлы доступны пользователю (база, сессия, куки)
  • Создаем контроллер для отображения нужных файлов (или не создаем, а используем существующие) и модель для работы с таблицей в базе, где хранится эта информация, например FilesAccess
  • В контроллере ставим экшн для отображения файлов:

    // на корректность кода так же не претендую, наверняка в Yii предусмотрены более продуманные варианты отображения изображений, нужно читать документацию

        public function actionShowFile() {
            $fileName = Yii::$app->request->get("file_name");
            $allowed = FilesAccess::isAllowed($fileName); // Этот метод проверяет в табилце `files_access` доступен ли файл для доступа данному пользователю
            if ( $allowed ) {
                $response = Yii::$app->getResponse();
                $response->headers->set('Content-Type', 'image/png');
                $response->format = Response::FORMAT_RAW;
                $response->stream = fopen("серверный/путь/до/нужной/папки" . $fileName, 'r');
                return $response->send();
            }
        }
    
READ ALSO
ошибка var_dump

ошибка var_dump

пишу проект на yii2при использовании var_dump для отладки показывает ошибку такого типа

220
Временная папка

Временная папка

Настройки phpini:

231
Как правильно передать ссылку?

Как правильно передать ссылку?

В базе хранится поле link (string(2048))Во view добавляю link в тег а

224
Сохранение файла PHP

Сохранение файла PHP

Создается XML файл, который с сохраняется в папку filesПосле создания появляется ссылка на скачивание

248