diff --git a/app/Http/Requests/ImageUploadRequest.php b/app/Http/Requests/ImageUploadRequest.php index 39d8287d5b..a6da2e3e40 100644 --- a/app/Http/Requests/ImageUploadRequest.php +++ b/app/Http/Requests/ImageUploadRequest.php @@ -5,15 +5,12 @@ namespace App\Http\Requests; use App\Models\SnipeModel; use Intervention\Image\Facades\Image; use enshrined\svgSanitize\Sanitizer; -use Illuminate\Support\Arr; -use Illuminate\Support\Collection; -use Illuminate\Support\Str; -use Symfony\Component\HttpFoundation\FileBag; -use Symfony\Component\HttpFoundation\ParameterBag; +use App\Http\Traits\ConvertsBase64ToFiles; use Storage; class ImageUploadRequest extends Request { + use ConvertsBase64ToFiles; /** * Determine if the user is authorized to make this request. @@ -182,86 +179,5 @@ class ImageUploadRequest extends Request return $item; } - - /** - * Helper method to get the body parameters bag. - * - * @return \Symfony\Component\HttpFoundation\ParameterBag - */ - private function bodyParametersBag(): ParameterBag - { - return $this->request; - } - - /** - * Helper method to get the uploaded files bag. - * - * @return FileBag - */ - private function uploadFilesBag(): FileBag - { - return $this->files; - } - - /** - * Pulls the Base64 contents for each file key and creates - * an UploadedFile instance from it and sets it on the - * request. - * - * @return void - */ - protected function prepareForValidation() - { - $flattened = Arr::dot($this->base64FileKeys()); - - Collection::make($flattened)->each(function ($filename, $key) { - rescue(function () use ($key, $filename) { - // dont process plain files - if ( $this->file($key)){ - return; - } - - $base64Contents = $this->input($key); - - if (!$base64Contents) { - return; - } - - // autogenerate filenames - if ($filename == 'auto'){ - $header = explode(';', $base64Contents, 2)[0]; - // Grab the image type from the header while we're at it. - $filename = $key . '.' . substr($header, strpos($header, '/')+1); - } - - // Generate a temporary path to store the Base64 contents - $tempFilePath = tempnam(sys_get_temp_dir(), $filename); - - // Store the contents using a stream, or by decoding manually - if (Str::startsWith($base64Contents, 'data:') && count(explode(',', $base64Contents)) > 1) { - $source = fopen($base64Contents, 'r'); - $destination = fopen($tempFilePath, 'w'); - - stream_copy_to_stream($source, $destination); - - fclose($source); - fclose($destination); - } else { - file_put_contents($tempFilePath, base64_decode($base64Contents, true)); - } - - $uploadedFile = new UploadedFile($tempFilePath, $filename, null, null, true); - - $body = $this->bodyParametersBag()->all(); - Arr::forget($body, $key); - $this->bodyParametersBag()->replace($body); - - $files = $this->uploadFilesBag()->all(); - Arr::set($files, $key, $uploadedFile); - $this->uploadFilesBag()->replace($files); - }, null, false); - }); - } - } diff --git a/app/Http/Traits/ConvertsBase64ToFiles.php b/app/Http/Traits/ConvertsBase64ToFiles.php index 71d316f848..13c939e4db 100644 --- a/app/Http/Traits/ConvertsBase64ToFiles.php +++ b/app/Http/Traits/ConvertsBase64ToFiles.php @@ -88,10 +88,14 @@ trait ConvertsBase64ToFiles $body = $this->bodyParametersBag()->all(); Arr::forget($body, $key); $this->bodyParametersBag()->replace($body); + \Log::debug("Trait: file field $key replaced:". $request->has($key)); + $files = $this->uploadFilesBag()->all(); Arr::set($files, $key, $uploadedFile); $this->uploadFilesBag()->replace($files); + \Log::debug("Trait: file field $key inserted:". $request->hasFile($key)); + }, null, false); }); }