Страница 1 из 1

Как получить изображение через HTTP-запрос[Решено]

Добавлено: 2018.04.06, 18:59
kopernik21187
Здравствуйте, уважаемые форумчане! Делаю первый проект на Yii. Так что заранее извиняюсь, если вдруг задаю глупые вопросы.
Задача следующая: в приложении на Yii2 есть папка в корне файловой структуры uploads, в которой собственно и хранятся все файлы.

Мне теперь нужно выводить файлы из этой папки. Я создал контроллер:

Код: Выделить всё

public function actionImage(){

        $player = Players::findOne(Yii::$app->user->identity->id);
        $avatar = Images::find()->where(['id' => $player->avatar])->one();

        $response = Yii::$app->getResponse();
        $response->headers->set('Content-Type', 'image/jpeg');
        $response->format = Response::FORMAT_RAW;

        $imgFullPath = Yii::getAlias('@uploads').$avatar->path;


        if (!is_resource($response->stream = fopen($imgFullPath, 'r')) ) {
            throw new \yii\web\ServerErrorHttpException('file access failed: permission deny');
        }
        return $response->send();

    }
    
который успешно отрабатывает. В браузере я вижу нужно изображение.

Теперь мне нужно получить это изображение программно в переменную. Делаю это через HTTP-запрос:

Код: Выделить всё

$client = new Client([
                            'baseUrl' => 'http://tennis.local',
                            'requestConfig' => [
                                'format' => Client::FORMAT_RAW_URLENCODED
                            ],
                            'responseConfig' => [
                                'format' => Client::FORMAT_RAW_URLENCODED
                            ],
                        ]);

                        $request = $client->createRequest()
                            ->setFormat(Client::FORMAT_RAW_URLENCODED)
                            ->setHeaders(['content-type' => 'image/jpeg'])
                            ->setUrl('/account/image');

                        $image = Yii::$app->getResponse()->sendFile('/home/kostya/server/tennis.local/uploads/avatars/1/N-AJYVQdMug.jpg', 'monrofile', [
                            'mimeType' => 'image/png',
                            'inline' => true,
                        ]);
Но в переменной $image->data и $image->content пустота. Подскажите, пожалуйста, как правильно получить теперь изображение через HTTP-запрос. Заранее спасибо!

Re: Как получить изображение через HTTP-запрос

Добавлено: 2018.04.06, 20:21
nickdenry
Теперь мне нужно получить это изображение программно в переменную
Зачем?

Re: Как получить изображение через HTTP-запрос

Добавлено: 2018.04.07, 10:55
kopernik21187
nickdenry писал(а): 2018.04.06, 20:21
Теперь мне нужно получить это изображение программно в переменную
Зачем?
У меня форма редактирования аккаунта. Пользователь загружает аватарку, и после загрузки аватарки должен её видеть. Но так как папка с аватарками у меня находится не внутри папки web, то я как-то должен получить доступ к изображению внутри папки /uploads/, которая находится в корне файловой структуры приложения. Тут скорее даже можно задать вопрос следующим образом: как получить доступ к изображению в папке, не находящейся внутри папки web?

Re: Как получить изображение через HTTP-запрос

Добавлено: 2018.04.07, 11:12
ElisDN
Прокинуть папку символической ссылкой внутрь web.

Re: Как получить изображение через HTTP-запрос

Добавлено: 2018.04.07, 15:30
nickdenry
kopernik21187 писал(а): 2018.04.07, 10:55 Но так как папка с аватарками у меня находится не внутри папки web
Почему не внутри папки web? Что это дает?

Re: Как получить изображение через HTTP-запрос

Добавлено: 2018.04.07, 17:19
kopernik21187
nickdenry писал(а): 2018.04.07, 15:30
kopernik21187 писал(а): 2018.04.07, 10:55 Но так как папка с аватарками у меня находится не внутри папки web
Почему не внутри папки web? Что это дает?
Ну у нас что-то вроде соц. сети не большой. И некоторые фотографии пользователей могут быть скрыты настройками приватности, поэтому мы хотим делать отображение только в том случае, если это разрешено настройками. А если скажем известен src какого-то изображения, то его можно будет открыть в браузере, что в нашем случае быть не должно. Мы отдаём изображение только если это разрешено, а если нет, то человек не должен получать доступ к изображению извне, даже если знает src. Надеюсь, что понятно донёс суть)

Re: Как получить изображение через HTTP-запрос

Добавлено: 2018.04.07, 17:25
nickdenry
Как один из вариантов должно подойти это:

http://php.net/manual/ru/function.readfile.php

Код: Выделить всё

$img = 'path/to/image.jpg';
header('Content-Type: image/jpeg');
readfile($img);
https://stackoverflow.com/a/9959148

В любом случае, хранить изображения можно и стоит в web, но обращение к изображения с помощью .htaccess сделать через php, где уже решать что делать с запросом дальше.

Re: Как получить изображение через HTTP-запрос

Добавлено: 2018.04.07, 17:39
urichalex
А что мешает публиковать ресурсами?

Re: Как получить изображение через HTTP-запрос

Добавлено: 2018.04.09, 09:32
kopernik21187
ElisDN писал(а): 2018.04.07, 11:12 Прокинуть папку символической ссылкой внутрь web.
nickdenry писал(а): 2018.04.07, 17:25 Как один из вариантов должно подойти это:

http://php.net/manual/ru/function.readfile.php

Код: Выделить всё

$img = 'path/to/image.jpg';
header('Content-Type: image/jpeg');
readfile($img);
https://stackoverflow.com/a/9959148

В любом случае, хранить изображения можно и стоит в web, но обращение к изображения с помощью .htaccess сделать через php, где уже решать что делать с запросом дальше.
Спасибо! Буду пробовать!

Re: Как получить изображение через HTTP-запрос

Добавлено: 2018.04.12, 17:07
kopernik21187
Спасибо большое всем, кто помог!

На будущее может кому-то пригодится. Изображение получил вот так:

Код: Выделить всё

class ImagesController extends \yii\web\Controller
{
    
    public function actionUseravatar()
    {

        $player = Players::findOne(Yii::$app->user->identity->id);
        $avatar = Images::find()->where(['id' => $player->avatar])->one();

        $response = Yii::$app->getResponse();
        $response->headers->set('Content-Type', 'image/jpeg');
        $response->format = Response::FORMAT_RAW;

        $imgFullPath = Yii::getAlias('@uploads').$avatar->path;


        if (!is_resource($response->stream = fopen($imgFullPath, 'r')) ) {
            throw new \yii\web\ServerErrorHttpException('file access failed: permission deny');
        }
        return $response->send();


        //return $this->render('index');
    }

}

Вывел вот так:

Код: Выделить всё

<img src="/images/useravatar" />