Как в 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, имя файла и прочие заголовки ответа сервера, а после этого вернет указанный файл на скачивание.