7
5

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 ファイルアップロード時にバリデーションで「The file failed to upload.」と表示される

Last updated at Posted at 2021-02-02

〜宣伝〜

個人開発でエンジニア専門マッチングサービスを開発しましたので、是非未経験からエンジニア目指している人!現役エンジニアで教えたい人!使ってみてください!

β版リリース記念キャンペーン中です!

10名様限定、抽選でお好きな技術本1冊プレゼント!
🎉当選者にはメッセージ差し上げます(送付の際に住所はお聞きしません)
詳しくはこちらから↓

https://x.com/dokupro01/status/1796837336145436846

目的

  • ファイルアップロード時にバリデーションエラーで「The file failed to upload.」と出力される問題を解決する。

環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2 GHz クアッドコアIntel Core i5
メモリ 32 GB 3733 MHz LPDDR4
グラフィックス Intel Iris Plus Graphics 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.11 Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする
Laravel バージョン 6.X commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う
MySQLバージョン 8.0.21 for osx10.15 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする

問題までの経緯

  1. laravelアプリでファイルをアップロードする機能を作成してファイルサイズ3 MB以下のバリデーションをかけた。
  2. 7.4 MBの容量のファイルのアップロードを試みた。

問題

  • バリデーションエラーに下記のメッセージが出力されてバリデーションで弾かれた。

    The file failed to upload.
    

問題解決までの経緯

  1. バリデーションのファイルサイズの記載を削除して再アップロードしても同じバリデーションエラーが発生する。

  2. 流石にアップロードしたいファイルが大きすぎたと思いバリデーションをファイルサイズ1.6 MB以下に書き直した。

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'subject' => 'required',
            'content' => 'required',
            // 下記を修正
            'file' => 'file|max:1600|mimes:jpeg,png,jpg,pdf',
        ];
    }
    
    /**
     * バリデーションエラーメッセージ
     *
     * @return array
     */
    public function messages()
    {
        return [
            'subject.required' => 'メール件名を記入してください。',
            'content.required' => 'メール本文を記入してください。',
            'file.max' => '1.6MBを超えるファイルは添付できません。',
            'file.mimes' => '指定のファイル形式以外は添付できません。',
        ];
    }
    
  3. 1.7 MBの画像ファイルをアップロードしてみたところ下記のバリデーションエラーが出力された。

    1.6MBを超えるファイルは添付できません。
    
  4. これは自分で設定したバリデーションルールによって弾かれていることを表す。

  5. php.iniファイルにアップロードできるファイルサイズの上限を指定している部分があるようなので見てみる。

  6. 下記方法を使ってphp.iniファイルの場所を突き止めて開いてみた。

  7. 下記の2つの項目をviの検索機能を用いて検索した。

    • post_max_size: PHPが受け入れる投稿データの最大サイズ
    • upload_max_filesize: アップロードされたファイルの最大許容サイズ
  8. 下記のようにpost_max_sizeは8 MB、upload_max_filesizeは2 MBと指定されていた。

    MailRequest_php_—_laravel6.png
    MailRequest_php_—_laravel6.png

  9. どうやらセキュリティ上の理由からアップロードファイルのサイズに制限がかかっているようだ。

  10. 7.4 MBのファイルをアップロードする際に弾かれたのでupload_max_filesizeに弾かれたと思われる。

  11. sudoコマンドを駆使しviでphp.iniを開きpost_max_sizeupload_max_filesizeをそれぞれ「10M」に修正した。

  12. laravelのバリデーションの記載を下記のように修正した。

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'subject' => 'required',
            'content' => 'required',
            // 下記を修正
            'file' => 'file|max:10000|mimes:jpeg,png,jpg,pdf',
        ];
    }
    
    /**
     * バリデーションエラーメッセージ
     *
     * @return array
     */
    public function messages()
    {
        return [
            'subject.required' => 'メール件名を記入してください。',
            'content.required' => 'メール本文を記入してください。',
            'file.max' => '10 MBを超えるファイルは添付できません。',
            'file.mimes' => '指定のファイル形式以外は添付できません。',
        ];
    }
    
  13. 7.4 MBの容量のファイルのアップロードを試みたところバリデーションに弾かれることなくファイルアップロードをすることができた。

参考文献

7
5
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
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?