Laravelで画像がアップできたりできなかったりした問題

###2020.02.19追記

本事象の原因は作品をALBで運用しているためでした。
[LaravelでS3を使用する](ahttps://qiita.com/tashi_kyn/items/76a621e6567a51bd78ab)

タイトルは以下の通り修正します。

**~~Laravelで画像が表示されたりされなかったりした問題~~**

**Laravelで画像がアップできたりできなかったりした問題**


以下原文

#何が起こったか
ポートフォリオとして作成した掲示板アプリケーションの本番環境で、storageに保存した画像がviewで読み込まれなかったり読み込まれたりした。


##おさらい
- publicディレクトリに保存したくない画像の場合、`storage/app/public`に保存し、`public/storage`からシンボリックリンクを作成する
- DBには画像へのパスを記録（私の場合）

##改めて、表示されるか試す
<img width="978" alt="スクリーンショット 2020-02-12 17.39.53.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380817/5f9e1659-e7e9-e564-5314-bf6ff4a36871.jpg">

表示されました。設定自体は問題なさそう。


##別の画像を登録
<img width="977" alt="スクリーンショット 2020-02-12 17.41.31.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380817/d363342a-298d-9227-63cd-8c595a9b2231.jpg">

どうやら画像ファイル自体の違いに起因している・・・？

##画像ファイルを比較
表示された方
<img width="393" alt="スクリーンショット 2020-02-12 17.43.19.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380817/0c4dcb9b-e96f-0a79-f33c-590f7e7700e6.jpg">

表示されなかった方
<img width="396" alt="スクリーンショット 2020-02-12 17.43.38.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380817/570ab1c6-18bd-8a5c-fec8-0407c11614f8.jpg">

サイズが怪しい。

##サイズを小さくする
<img width="391" alt="スクリーンショット 2020-02-12 17.47.16.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380817/76253679-8128-2b16-2f28-15eebd020563.jpg">

##登録してみる
<img width="967" alt="スクリーンショット 2020-02-12 17.48.18.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380817/c39ae435-af7c-973f-99e6-7e8fde720beb.jpg">

登録できた！

##そもそも画像の保存はうまくいっているのか
```
$ ls -s
合計 7652
…
0 1581496719IMG_5309.JPG
940 1581497294IMG_5309_resize.JPG`
```

0・・・？

##バリデーションを確認してみた
アップロード自体がうまくいっていなさそうだったので、怪しいところを探ってみます。

```Request.php
    public function rules()
    {
        return [
            'photo' => 'file|image|mimes:jpeg,png,jpg,gif|max:2048',
            'division' => 'max:30',
            'specialty' => 'max:30',
            'hobby' => 'max:30',
            'biography' => 'max:1000'
        ];
    }
```

max2048を設定していた（忘れてた）。
ー＞開発環境では問題なく登録できていたのに…？

##viewを確認
```view
<div class="form-group">
　<label class="form-label" for="photo_id">プロフィール画像</label>
　<input class="form-input" type="file" name="photo_id" accept="image/*">
</div>
```
name属性とバリデーションの定義が合っていない初歩的なミス。


##とりあえずRequestを修正
```Request.php
    public function rules()
    {
        return [
            'photo_id' => 'file|image|mimes:jpeg,png,jpg,gif|max:2048',
            'division' => 'max:30',
            'specialty' => 'max:30',
            'hobby' => 'max:30',
            'biography' => 'max:1000'
        ];
    }
```

バリデーションが動作するようにしました。
しかし、本質的な解決に繋がるかどうかはまだわからないので、一旦デプロイしてみることにします。

##再度アップロード
<img width="969" alt="スクリーンショット 2020-02-12 19.29.01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380817/0a88dd06-492d-af59-0491-bcae0ae48005.jpg">

エラーが出ました。
Requestファイルで定義したmessagesとも異なるみたいで、バリデーションが原因ではなさそう。タイムアウトとか？

##PHPとApacheの設定が怪しい
見つけました。

[大容量ファイルアップロードに関係するPHP・Apacheの設定](https://b-risk.jp/blog/2013/03/megafile/)
>どうしても大きめのデータ（ex. 1GB程度）をアップロードしたい！という場合、
PHPの設定やApacheの設定がデフォルトのままだとアップロードできません。
（デフォルトは2MBまで）

PHPもApacheもそれぞれにデフォルトのファイルアップロード制限が設けられていることがわかりました。調べて見たところ、今回はPHPの以下設定変更だけで対応できそうです。

```php.ini
upload_max_filesize = 2M
```

↓

```php.ini
upload_max_filesize = 10M
```

バリデーションの上限　＜　php.iniの上限
とすることで、バリデーションによるチェックを優先させました。

画像が表示されない問題について解消できました。


駆け出しエンジニアとして、初めてのQiita投稿でした。おかしな点があれば指摘いただけると嬉しいです。