我需要能够调整图像的大小并将调整后的版本放回$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 :(得分:1)
我刚刚读到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);