I am converting base64 encoded string to UploadedFile for those fields ending with 'File'.

Middleware

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Arr;
use Illuminate\Http\File;

class Base64ToUploadedFileMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        $inputs = $request->request->all();

        foreach($inputs as $fieldName => $fieldValue) {
            if(str_ends_with($fieldName, 'File') && $fieldValue != null) {
                $fileData = base64_decode(Arr::last(explode(',', $fieldValue)));

                $tempFile = tmpfile();
                $tempFilePath = stream_get_meta_data($tempFile)['uri'];

                file_put_contents($tempFilePath, $fileData);

                $tempFileObject = new File($tempFilePath);
                $file = new UploadedFile(
                    $tempFileObject->getPathname(),
                    $tempFileObject->getFilename(),
                    $tempFileObject->getMimeType()
                );

                app()->terminating(function () use ($tempFile) {
                    fclose($tempFile);
                });

                $request->request->remove($fieldName);
                $request->files->set($fieldName, $file);
            }
        }

        return $next($request);
    }
}

DocumentRequest

public function rules()
{
    $alignments = ['LEFT', 'CENTER', 'RIGHT'];

    $updateId = request('id', null);
    $uniqueRule = 'unique:documents,header';

    if($updateId)
        $uniqueRule .= ',' . $updateId . ',id,created_by,' . auth()->user()->id;

    return [
        'headerText' => [ 'required', 'max:255', $uniqueRule ],
        'headerTextAlignment' => [ 'required', 'in:' . implode(',', $alignments) ],
        'headerLogoFile' => [ 'nullable', 'file', 'mimes:jpeg,jpg,png', 'size:2000'],
        'headerLogoAlignment' => [ 'nullable', 'in:' . implode(',', $alignments) ],
        'content' => [ 'required', 'not_regex:/\<script\>[^<]*\<\/script\>/i' ],
        'pdfFile' => [ 'required', 'file', 'mimes:pdf', 'size:100000' ]
    ];
}

When I try to upload the converted file inside middleware, it is uploaded successfully, but when validation rules complete processing - it shows errors for files like the following

{
    "message": "The given data was invalid.",
    "errors": {
        "headerLogoFile": [
            "The header logo file failed to upload."
        ]
    }
}
0

There are 0 best solutions below