총 업로드 파일 크기에 대한 맞춤형 Laravel 유효성 검사 규칙 생성 🚫✅

10985 단어 tutoriallaravelphphelp
나는 현재 거의 모든 자유 시간을 차지하는 주요 사이드 프로젝트를 진행하고 있습니다. 이 프로젝트에서 전체 크기가 10MB 미만인지 확인하기 위해 제출된 파일 배열을 확인해야 했습니다. Laravel의 유효성 검사 문서에서 나를 위해 이를 수행할 수 있는 항목을 찾을 수 없었기 때문에 나만의 사용자 지정 유효성 검사 규칙을 작성해야 한다고 결정했습니다.

업로드된 파일 배열의 유효성을 검사하는 가장 좋은 방법을 찾고 있었고 StackOverFlow에서 솔루션의 큰 부분을 찾았지만 문제는 이 솔루션이 거의 5년이 되었다는 것입니다. 그래서 몇 분 동안 목표를 달성한 방법에 대한 빠른 자습서를 작성하고 StackOverFlow에서 찾은 솔루션의 영향을 받은 나만의 사용자 지정 유효성 검사 규칙을 만들기로 결정했습니다.

시작하자 🚀


내용의 테이블


1- Input

2- Routes

3- Validation

4- Custom validation


1- 입력:

This is a simple HTML input tag that supports specific picture formats as well as multiple file uploads. The input is wrapped with a form that POST the files to the 'images/upload route.'

    <form action="images/upload" method="POST">
        <input
            type="file"
            id="thumbnail"
            name="thumbnail"
            class="h-full w-full z-50 opacity-0 cursor-pointer"
            accept="image/png, image/jpeg, image/jpg, image/gif, image/webp"
            multiple
            required
        />
    </form>

2- 경로:

In routes/web.php file, we're using the ImageUploadController@store to handle post requests to this route.

Route::post('images/upload', [ImageUploadController::class, 'store'])->name('images.upload');

3- 검증:

I usually don't ever do any validation within my controller, I follow the documentation php artisan make:request StoreImagesRequest으로 새 요청을 생성한 다음 아래와 같이 유효성 검사를 추가합니다.

    public function rules()
    {
        return [

            'images' => ['bail', 'required'],
            'images.*' => ['bail', 'image', 'mimes:jpeg,jpg,png,gif,webp']
        ];
    }


컨트롤러 저장소 메서드 내에서 유효성 검사를 수행하는 것은 중요하지 않습니다. 내 솔루션은 어느 쪽이든 작동합니다.

다음 단계는 php artisan make:rule Maxsize --invokable 명령을 실행하고 app/Rules/Maxsize 파일로 이동해야 합니다.

A rule object contains a single method: __invoke. This method receives the attribute name, its value, and a callback that should be invoked on failure with the validation error message.



<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\InvokableRule;

class Maxsize implements InvokableRule
{
    /**
     * Run the validation rule.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @param  \Closure  $fail
     * @return void
     */
    public function __invoke($attribute, $value, $fail)
    {
        // Logic goes here
    }
}


위의 코드는 Attribute, Value 및 Fail을 수신하는 빈 규칙을 보여줍니다. 호출된 함수에 유효성 검사 논리를 코딩하고 실패할 경우 응답을 전달하기만 하면 됩니다. 우리의 경우와 같이 속성을 지정하지 않은 경우 '$attribute' 변수를 무시하십시오. 입력 데이터는 '$value' 변수에 저장되며 '$fail' 변수에 문자열 응답을 할당하여 유효성 검사가 실패할 경우 응답을 정의할 수 있습니다.

이제 우리의 목표로 돌아가자. 여기서 우리가 하려는 것은 파일 배열을 반복하고 각 파일의 총 파일 크기를 계산한 다음 결과가 10.000KB보다 크면 실패 응답을 보내는 것입니다.

이를 위해 을 사용할 것입니다.

array_reduce — Iteratively reduce the array to a single value using a callback function



    public function __invoke($attribute, $value, $fail)
    {
        $total_size = array_reduce($value, function ($sum, $item) {
            // each item is UploadedFile Object
            $sum += filesize($item->path());
            return $sum;
        });

        if ($total_size > 10000 * 1000) {
            $fail('Total images size should be maximum 10 Megabytes');
        }
    }


이 코드에서는 총 파일 크기를 계산하여 배열에서 단일 값을 반환합니다. 각 파일 크기를 계산하기 위해 을 사용하고 Laravel의 Following the 을 사용하여 파일 경로를 전달합니다.

그런 다음 총 크기가 10mb 이상인지 확인하고 path() 변수 값을 반환합니다.

이제 유효성 검사에 사용하는 모든 위치(제 경우에는 $fail)로 가져와서 유효성 검사 규칙을 사용할 수 있습니다.

<?php

namespace App\Http\Requests;

use App\Rules\Maxsize;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class StoreImagesRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {
        return [

            'images' => ['bail', 'required', new Maxsize],
            'images.*' => ['bail', 'image', 'mimes:jpeg,jpg,png,gif,webp']
        ];
    }
}



명쾌한 설명이 되었기를 바라며 궁금한 점이 있으면 댓글로 알려주세요 👋

좋은 웹페이지 즐겨찾기