如何构建图像上传对象并附加到 Laravel 中的请求

我正在尝试构建一个图像上传对象并附加到 Laravel 中的请求。

我目前有一个中间件可以拦截请求并检查其中是否有 base64 图像字符串,如果有,它将其转换为图像对象并将其附加回请求。

我没有成功将转换后的图像附加回请求作为一个实例,我Illuminate\Http\UploadedFile已经尝试了一些我发现的最接近的东西UploadedFile::fake()->image('avatar.jpg');但是我如何使用我自己的 base64 转换后的图像而不是通过 UploadedFile 生成假图像Api我无法提出解决方案。

这是我到目前为止所拥有的

<?php


    namespace App\Http\Middleware;


    use Closure;

    use Illuminate\Support\Facades\Validator;

    use Illuminate\Support\Facades\Storage;

    use Illuminate\Http\UploadedFile;


    class Base64EncodedImageHandler

    {

        /**

         * Handle an incoming request.

         *

         * @param  \Illuminate\Http\Request  $request

         * @param  \Closure  $next

         * @return mixed

         */

        public function handle($request, Closure $next)

        {

            if ($request->has('photos')) {


                $validator = Validator::make($request->all(), [

                    'photos' => 'nullable|array|filled',

                    'photos.*' => 'required_unless:photos,'.null.'|image',

                ]);


                if ($validator->fails()) {


                    $images = collect($request->input('photos'))->map(function ($item, $key) {


                        if (preg_match('/^data:image\/(\w+);base64,/', $item)) {

                            $data = substr($item, strpos($item, ',') + 1);


                            $data = base64_decode($data);


                            // Testing to see if the image decoding worked

                            // Storage::disk('local')->put("public/test/".uniqid().".png", $data);



                            // Build image object



                            return $data;


                        }


                        return $item;

                    });


                    $request = $request->merge(['photos' => $images]);


                }


                // Dumping request object here

                dd($request);


            }


            return $next($request);

        }

    }


沧海一幻觉
浏览 65回答 1
1回答

MMTTMM

您可以尝试Symfony\Component\HttpFoundation\File\UploadedFile创建图像对象(您应该首先将 base64 文件保存在某个临时位置,因为UploadedFile需要路径)。然后在你Base64EncodedImageHandler使用 trait Illuminate\Http\Concerns\InteractsWithInput。您将需要此方法:protected function convertUploadedFiles(array $files)它接受 symfony UploadedFile 数组。这将成为Illuminate\Http\UploadedFile对象。现在,当您说$request->merge(['photos' => $images])您的“照片”将是您可以操作的 UploadedFile 对象数组时。我不确定,但也许你的遗嘱$request->file()仍然是空的。如果这是真的,您可以创建新请求,用原始请求中的所有其他数据填充它,但对于文件,请提供转换后的 UploadedFile 数组。您可以尝试使用->allFiles()甚至覆盖$files属性。请记住它接受FileBag,而不是array
打开App,查看更多内容
随时随地看视频慕课网APP