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."
]
}
}