Initial commit
This commit is contained in:
68
app/Rules/StorageFile.php
Normal file
68
app/Rules/StorageFile.php
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace App\Rules;
|
||||
|
||||
use App\Http\Controllers\Forms\PublicFormController;
|
||||
use App\Service\Storage\StorageFileNameParser;
|
||||
use Illuminate\Contracts\Validation\Rule;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class StorageFile implements Rule
|
||||
{
|
||||
public int $maxSize;
|
||||
|
||||
public string $error = 'Invalid file.';
|
||||
|
||||
/** @var string[] */
|
||||
public array $fileTypes;
|
||||
|
||||
/**
|
||||
* @param int $maxSize
|
||||
* @param string[] $fileTypes
|
||||
*/
|
||||
public function __construct(int $maxSize, array $fileTypes = [])
|
||||
{
|
||||
$this->maxSize = $maxSize;
|
||||
|
||||
$this->fileTypes = $fileTypes;
|
||||
}
|
||||
|
||||
/**
|
||||
* File can have 2 formats:
|
||||
* - file_name-{uuid}.{ext}
|
||||
* - {uuid}
|
||||
*
|
||||
* @param string $attribute
|
||||
* @param mixed $value
|
||||
* @return bool
|
||||
*/
|
||||
public function passes($attribute, $value): bool
|
||||
{
|
||||
$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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user