调整并替换Laravel请求中的图像

时间:2018-10-04 13:53:34

标签: php laravel laravel-5 laravel-request

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