1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Laravel】FormRequestでファイル名をバリデーション

Last updated at Posted at 2025-03-18

はじめに

LaravelのFormRequestではファイル形式のバリデーションもサポートしていますが、ファイル名でバリデーションしたい場合は、カスタムルールを作成する必要があります。

本記事では、カスタムルールFilenameを作成し、ファイル名の長さ正規表現チェックを実装します。

Filename実装

Rules\Filenameクラス作成

php artisan make:rule Filename

実装内容

Filename.php
<?php

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class Filename implements ValidationRule
{
    /**
     * Run the validation rule.
     *
     * @param  \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString  $fail
     */
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        $name = $value->getClientOriginalName();

        // 長さ
        $nameLengthMax = 100;
        $nameLength = mb_strlen($name);
        if ($nameLength > $nameLengthMax) {
            $fail(":attributeのファイル名は拡張子を含めて{$nameLengthMax}字以内にしてください。");
        }

        // 正規表現
        $pattern = "/[^a-zA-Z0-9ぁ-んァ-ヴー一-龠!_.*'()\-]/u"; // 絵文字などは引っかかる
        if (preg_match_all($pattern, $name, $matches)) {
            $invalidCharacters = $matches[0];
            $fail(":attributeのファイル名に不正な文字(" . implode(', ', $invalidCharacters) . ")が含まれています。");
        }
    }
}

Filenameでは、ファイル名の長さ正規表現を確認しています。正規表現については、引っかかったものをエラーメッセージで全て列挙するようにしています。
使用する場合は、お好みに応じて調整頂ければと思います。

使用例

使い方は以下になります。

SampleRequest.php
use App\Rules\Filename;

class SampleRequest extends FormRequest
{

    // 〜省略〜

    public function rules(): array
    {
        return [
            'sample_file' => ['nullable', 'mimetypes:image/jpeg,image/png', 'max:1024', new Filename()],
        ];
    }

まとめ

デフォルトで多くのルールを網羅しているFormRequestですが、細かいことをするにはカスタムルールを作成する必要があります。
カスタムルールを使えば、複雑な条件にも対応できるので、ぜひ使っていきましょう。

告知

最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。

みなさまからのご応募をお待ちしております。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?