Советы PHP-разработчика

Блог содержащий короткие заметки касающиеся программирования для web.

Как в Yii2 вернуть контент в виде файла для сохранения

Как в Yii2 вернуть контент в виде файла для сохранения

Иногда требуется отдать файлы пользователю не напрямую, а только после проверки прав. Или возвратить, сгенеририванный на лету, файл. Данную задачу достаточно просто решить в разрезе yii framework 2. Именно об этом и поговорим.

Все манипуляции с ответом сервера "проворачиваются" через Yii::$app->response. Если заглянуть в реализацию компонента, то можно обнаружить, что с его помощью возможно реализовать все часто встречающиеся операции с минимумом программинга, как такового. Но сейчас мы рассмотрим лишь его малую часть, а именно - методы для сохранения файла:

  • sendFile($filePath, $attachmentName = null, $options = []) - везвращает контент из заданного файла
  • sendContentAsFile($content, $attachmentName, $options = []) - отдает строковый контент, как файл
  • sendStreamAsFile(sendStreamAsFile) - возвращает контент из заданного потока, как файл

А теперь перейдем к примеру.

Допустим, у нас есть модель Image с полями id - идентификатор (int), src - имя файла без пути (varchar), alt - альтернативный текст (varchar), а все изображения хранятся в директории web/upload вашего приложения.

Необходимо реализовать возможность скачать изображение по id. В данном случае метод контроллера будет выглядеть следующим образом:

public function actionDownload($id) {
    $image = Image::findOne(['id' => $id]);
    if ($image === null) {
        throw new NotFoundHttpException('Image not found');
    }
    return Yii::$app->response->sendFile(Yii::getAlias('@webroot/uploads/' . $image->src));
}

Метод sendFile, сам установит необходимый mimeType, имя файла и прочие заголовки ответа сервера, а после этого вернет указанный файл на скачивание.

  • 2015-12-06 13:09:14