maxSize = $maxSize; $this->fileTypes = $fileTypes; } /** * File can have 2 formats: * - file_name-{uuid}.{ext} * - {uuid} * * @param string $attribute * @param mixed $value */ public function passes($attribute, $value): bool { // If full path then no need to validate if (filter_var($value, FILTER_VALIDATE_URL) !== false) { return true; } // This is use when updating a record, and file uploads aren't changed. if ($this->form) { $newPath = Str::of(PublicFormController::FILE_UPLOAD_PATH)->replace('?', $this->form->id); if (Storage::exists($newPath.'/'.$value)) { return true; } } $fileNameParser = StorageFileNameParser::parse($value); if (! $uuid = $fileNameParser->uuid) { return false; } $filePath = PublicFormController::TMP_FILE_UPLOAD_PATH.$uuid; if (! Storage::exists($filePath)) { return false; } if (Storage::size($filePath) > $this->maxSize) { $this->error = 'File is too large.'; return false; } if (count($this->fileTypes) > 0) { $this->error = 'Incorrect file type. Allowed only: '.implode(',', $this->fileTypes); return in_array($fileNameParser->extension, $this->fileTypes); } return true; } public function message(): string { return $this->error; } }