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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
kopernik21187
Сообщения: 7
Зарегистрирован: 2018.03.18, 14:47

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

Сообщение kopernik21187 » 2018.04.06, 18:59

Здравствуйте, уважаемые форумчане! Делаю первый проект на 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-запрос. Заранее спасибо!
Последний раз редактировалось kopernik21187 2018.04.12, 17:08, всего редактировалось 1 раз.

nickdenry
Сообщения: 98
Зарегистрирован: 2015.10.28, 04:55

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

Сообщение nickdenry » 2018.04.06, 20:21

Теперь мне нужно получить это изображение программно в переменную
Зачем?
Ответственные программисты с высоким уровнем технического долга (c)

kopernik21187
Сообщения: 7
Зарегистрирован: 2018.03.18, 14:47

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

Сообщение kopernik21187 » 2018.04.07, 10:55

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

Аватара пользователя
ElisDN
Сообщения: 5410
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN » 2018.04.07, 11:12

Прокинуть папку символической ссылкой внутрь web.

nickdenry
Сообщения: 98
Зарегистрирован: 2015.10.28, 04:55

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

Сообщение nickdenry » 2018.04.07, 15:30

kopernik21187 писал(а):
2018.04.07, 10:55
Но так как папка с аватарками у меня находится не внутри папки web
Почему не внутри папки web? Что это дает?
Ответственные программисты с высоким уровнем технического долга (c)

kopernik21187
Сообщения: 7
Зарегистрирован: 2018.03.18, 14:47

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

Сообщение kopernik21187 » 2018.04.07, 17:19

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

nickdenry
Сообщения: 98
Зарегистрирован: 2015.10.28, 04:55

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

Сообщение 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, где уже решать что делать с запросом дальше.
Ответственные программисты с высоким уровнем технического долга (c)

urichalex
Сообщения: 957
Зарегистрирован: 2015.08.07, 11:03

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

Сообщение urichalex » 2018.04.07, 17:39

А что мешает публиковать ресурсами?

kopernik21187
Сообщения: 7
Зарегистрирован: 2018.03.18, 14:47

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

Сообщение kopernik21187 » 2018.04.09, 09:32

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, где уже решать что делать с запросом дальше.
Спасибо! Буду пробовать!

kopernik21187
Сообщения: 7
Зарегистрирован: 2018.03.18, 14:47

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

Сообщение kopernik21187 » 2018.04.12, 17:07

Спасибо большое всем, кто помог!

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

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

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" />

Ответить