Как создать новый поток из кэша Redis - PullRequest
0 голосов
/ 08 февраля 2020

Я храню изображение внутри Redis.

$image = $cache->remember($key, null, function () use ($request, $args) {
            $image = $this->get('image');
            $storage = $this->get('storage');

            return $image->load($storage->get($args['path'])->read())
                        ->withFilters($request->getQueryParams())
                        ->stream();
        });

и пытается вернуть его:

return (new Response())
                ->withHeader('Content-Type', 'image/png')
                ->withBody($image);

выдает мне эту ошибку:

Return value of Slim\Handlers\Strategies\RequestResponse::__invoke() 
must implement interface Psr\Http\Message\ResponseInterface, string returned

$image переменная - это байты этого изображения. как я могу преобразовать эти байты в поток?

1 Ответ

1 голос
/ 12 апреля 2020

Чтобы создать поток из строки, вы можете использовать реализацию Slim в Psr\Http\Message\StreamFactoryInterface (см. PSR-17: HTTP Factories , или любую другую внешнюю библиотеку, реализующую тот же интерфейс (например, *). 1004 * laminas-diactoros ).

Используя библиотеку Slim, она должна выглядеть примерно так:

<?php

use Slim\Psr7\Response;
use Slim\Psr7\Factory\StreamFactory;

// The string to create a stream from.
$image = $cache->remember($key, null, function () use ($request, $args) {
    //...
});

// Create the stream factory.
$streamFactory = new StreamFactory();

// Create a stream from the provided string.
$stream = $streamFactory->createStream($image);

// Create a response.
$response = (new Response())
                ->withHeader('Content-Type', 'image/png')
                ->withBody($stream);

// Do whatever with the response.

В качестве альтернативы можно использовать метод StreamFactory::createStreamFromFile:

<?php

// ...

/*
 * Create a stream with read-write access:
 *
 *  'r+': Open for reading and writing; place the file pointer at the beginning of the file.
 *  'b': Force to binary mode.
 */
$stream = $streamFactory->createStreamFromFile('php://temp', 'r+b');

// Write the string to the stream.
$stream->write($image);

// ...
...