Мне нужно иметь возможность изменить размер изображения и вернуть измененную версию обратно в $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);
}
Я только что прочитал, что 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);
Других решений пока нет …