Изменить размер и заменить изображение в запросе Laravel

Мне нужно иметь возможность изменить размер изображения и вернуть измененную версию обратно в $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);
}

0

Решение

Я только что прочитал, что 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);
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru