Изменить размер и заменить изображение в запросе Laravel - PullRequest
0 голосов
/ 04 октября 2018

Мне нужно иметь возможность изменить размер изображения и поместить измененную версию обратно в $request, кто-нибудь знает, возможно ли это?

В основном я унаследовал некоторый код, который содержит потенциально более 100+ отдельный файлзагружать разделы, и теперь моя задача изменить размеры всех изображений на сайте, если они превышают определенный размер.

Так что теперь мне нужно перехватить ВСЕ загрузки изображений в приложении, определить, превышают ли они набор.размер и, если они есть, измените их размер.

Весь код, который я нашел в Интернете, показывает только, как изменить размер изображения, а затем сразу сохранить измененную версию, но мне нужно иметь возможность изменить размер изображения и поместить егоНАЗАД в $request для обработки контроллером.

Изображения поступают в виде массивов изображений из отдельных разделов, поэтому мне нужно иметь возможность зациклить весь запрос, проверьте, есть ли какие-либо извходные данные содержат / являются файлами, а затем проверяют их размеры.Если они превышают установленный размер, измените их размер и замените их в $request, чтобы при продолжении запроса контроллер мог обработать изображение как обычно, но он будет обрабатывать новую версию с измененным размером.

Я попытался изменить размеры изображений и затем использовать метод laravels $request->merge(), но я не могу заставить его работать.

В настоящее время я изменяю размеры всех изображений в промежуточном программном обеспечении, как это

public function handle($request, Closure $next)
{

    foreach($request->files as $fileKey => $file){

        //Create a new array to add the newly sized images in
        $newFileArray = [];


        //Get each of the files that are being uploaded in the request, if there are no files this will just be ignored.
        foreach ($file as $key => $f) {

            if(!is_null($f)){
                $image = Image::make($f);
                if($image->height() > 500 || $image->width() > 500){
                    $image->resize(500, null, function ($constraint) {
                        $constraint->aspectRatio();
                    });
                }
                $newFileArray[$key] = $image;
            } else {
                $newFileArray[$key] = null;
            }
        }

        $request->merge([
          $fileKey => $newFileArray
        ]);

    };

    return $next($request);
}

Я просто не могу заставить его работать!

Возможно ли это?

РЕДАКТИРОВАТЬ

После отличного предложения в комментариях одного изответы ниже, я добился этого, отредактировав файл временного изображения напрямую, чтобы мне не пришлось возиться с запросом, вот как я это сделал.

public function handle($request, Closure $next)
{

    foreach($request->files as $fileKey => $file){

        //Get each of the files that are being uploaded in the request, if there are no files this will just be ignored.
        foreach ($file as $key => $f) {
            if(!is_null($f)){
                $image = Image::make($f->getPathName());
                if($image->height() > 500 || $image->width() > 500){
                    $image->resize(500, null, function ($constraint) {
                        $constraint->aspectRatio();
                    });
                    $image->save($f->getPathName());
                }
            }
        }

    };

    return $next($request);
}

1 Ответ

0 голосов
/ 04 октября 2018

Я только что прочитал, что Laravel использует запросы PSR-7.

https://laravel.com/docs/5.7/requests#psr7-requests

Они неизменны.Другими словами, вы не можете изменить данные после установки.Однако то, что вы можете сделать, - это заставить его создать новый запрос с вашими новыми параметрами.

Глядя на интерфейс PSR-7, мы видим, что есть метод, который выглядит точно так же, каквам нужно:

https://github.com/php-fig/http-message/blob/master/src/ServerRequestInterface.php#L150

/**
 * Create a new instance with the specified uploaded files.
 *
 * This method MUST be implemented in such a way as to retain the
 * immutability of the message, and MUST return an instance that has the
 * updated body parameters.
 *
 * @param array $uploadedFiles An array tree of UploadedFileInterface instances.
 * @return static
 * @throws \InvalidArgumentException if an invalid structure is provided.
 */
public function withUploadedFiles(array $uploadedFiles);

Итак, делайте свое дело, создайте свой массив, и как только он будет готов, замените ваш запрос следующим образом:

$request = $request->withUploadedFiles($yourNewArray);
...